1、题干
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。
输入格式: 一个数字N,与一个数字M(N<30,M<900)
输出格式: M在N*N的螺旋方阵中的行列数
输出样例:
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
结尾无空行
2、思路
无非是转圈赋值,因此只要知道前进的方向、和前进的长度,即可用for循环把值填进去,前进方向和长度可以简单找规律得到
3、解题
1、复杂度为O(n^3)
可以列出行号、列号与圈数,然后找出它们的关系
在这里用行号与列号的变换来直接表示前进的方向与长度
public static void matrix(int n , int m) {
int[][] ints = new int[n][n];
if (n >= 30 || m >= 900) {
System.out.println("请重新输入,n或者m超过上限");
return;
}
//cnt表示第几个数
//circle表示转了几圈
//i为行号,j为列号
//根据行号、列号与圈数的关系构造矩阵
int cnt = 1, circle = 0, i = 0, j = 0;
while (cnt <= n * n) {
for (j = circle; j <= n - 1 - circle; j++) {
//检验是否是要找的数
if (cnt==m) {
System.out.println((i +1)+ " " + (j+1));
cnt = n*n+1;
break;
}
ints[i][j] = cnt++;
}
//为true说明已找到
if (cnt>n*n)
break;
j--;
for (i = i + 1; i <= n - 1 - circle; i++) {
if (cnt==m) {
System.out.println((i +1)+ " " + (j+1));
cnt = n*n+1;
break;
}
ints[i][j] = cnt++;
}
if (cnt>n*n)
break;
i--;
for (j = j - 1; j >= circle; j--) {
if (cnt==m) {
System.out.println((i +1)+ " " + (j+1));
cnt = n*n+1;
break;
}
ints[i][j] = cnt++;
}
if (cnt>n*n)
break;
j++;
for (i = i - 1; i >= 1 + circle; i--) {
if (cnt==m) {
System.out.println((i +1)+ " " + (j+1));
cnt = n*n+1;
break;
}
ints[i][j] = cnt++;
}
if (cnt>n*n)
break;
i++;
circle++;
}
}