藍橋杯-螺旋數列
【問題描述】
對于一個 n 行 m 列的表格,我們可以使用螺旋的方式給表格依次填上正整數,我們稱填好的表格為一個螺旋矩陣。
例如,一個 4 行 5 列的螺旋矩陣如下:
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
【輸入格式】
輸入的第一行包含兩個整數 n, m,分别表示螺旋矩陣的行數和列數。
第二行包含兩個整數 r, c,表示要求的行号和列号。
【輸出格式】
輸出一個整數,表示螺旋矩陣中第 r 行第 c 列的元素的值。
【樣例輸入】
4 5
2 2
【樣例輸出】
import java.util.Scanner;
public class 螺旋數列 {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("please input n&&m:");
int n = sc.nextInt();
int m = sc.nextInt();
System.out.println("please input r&&c:");
int r = sc.nextInt();
int c = sc.nextInt();
int num = 1;
int up = 0,down = n,left = 0,right = m;
int a[][] = new int [n][m];
//開始順時針構造數列
while(true){
//從第up行開始構造 第一步:
for(int H = left;H<right;H++){
a[up][H] = num++;
}
/*
此時第一列已經構造完成,如果接着構造最右邊一列需要從up+1那一行按順序向下開始
因為第up行已經指派過了
構造原理如下圖所示
*/
up++;
if(up==down)
break;
//然後按順序構造最右邊的一列 第二部:
for(int L=up;L<down;L++){
a[L][right-1] = num++;
}
right--;
if(left==right)
break;
//構造最後一行 第三步:
for(int H=right-1;H>=left;H--){
a[down-1][H] = num++;
}
down--;
if(up==down)
break;
//構造最左側數列 第四步:
for(int L=down-1;L>=up;L--){
a[L][left] = num++;
}
left++;
if(left==right)
break;
}//OVER
System.out.println(a[r-1][c-1]);
}
}
構造原理(圖解):
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL3VFVNRTWE50MRpHW3BjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4YTM1MDNygTM3ADNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
運作結果如下所示:
輸入資料和輸出資料提示語在送出的時候去掉,因為不符合輸出格式