Description
螺旋方阵
Input
一个整数n(0<n<10)
Output
一个n行方阵,每行n个数,每个数场宽为3
Sample Input 1
5
Sample Output 1
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
代码如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[][] arr = new int[n][n];
Spiral(arr);
}
public static void Spiral(int arr[][]) {
/*令行为i,列为j,从0开始计数
观察可知
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
第零行1 2 3 4行不变,列递增
第四列5 6 7 8列不变,行递增
第四行9 10 11 12行不变,列递增
*/
int num = 1;
int q = 0;//循环的圈数
while (true) {
//第一个循环,行不变,列递增
for (int i = q; i < q + 1; i++) {//保持行不变
for (int j = q; j < arr.length - 1 - q; j++) {
arr[i][j] = num;
num++;
}
}
/*
1 2 3 4 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
*/
//列不变,行递增
for (int j = arr.length - 1 - q; j < arr.length - q; j++) {
for (int i = q; i < arr.length - 1 - q; i++) {
arr[i][j] = num;
num++;
}
}
/*
1 2 3 4 5
0 0 0 0 6
0 0 0 0 7
0 0 0 0 8
0 0 0 0 0
*/
for (int i = arr.length - 1 - q; i < arr.length- q; i++) {
for (int j = arr.length - 1 - q; j > q; j--) {
arr[i][j] = num;
num++;
}
}
/*
1 2 3 4 5
0 0 0 0 6
0 0 0 0 7
0 0 0 0 8
0 12 11 10 9
*/
for (int j = q; j < 1 + q; j++) {
for (int i = arr.length - 1 - q; i > q; i--) {
arr[i][j] = num;
num++;
}
}
/*
1 2 3 4 5
16 0 0 0 6
15 0 0 0 7
14 0 0 0 8
13 12 11 10 9
至此第一圈的循环结束*/
q++;//圈数增加,开始内圈循环
if (q == arr.length / 2) {//当螺旋到达矩阵最中间,可以结束循环
//当是奇数矩阵时,循环到最后一圈中间有一个数
if (arr.length % 2 == 1) {
arr[arr.length / 2][arr.length / 2] = num;
}
break;
}
}
//遍历数组输出
for(int i=0;i< arr.length;i++){
for(int j=0;j< arr.length;j++) {
System.out.printf("%3d", arr[i][j]);
}
System.out.printf("\n");//换行
}
}
}
结果如下:
该代码主要是观察数据递增方向与圈数,找出之间的联系,控制行(列)不变,让列(行)进行递增,由此根据四个方向的循环,并一圈圈往内层推进。
本文参考以下链接:http://t.csdnimg.cn/slLTj
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。