1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
------解决方案--------------------
试着写了一个,供你参考,能够实现的方法肯定还有很多。
public static void main(String[] args) {
int m = 3; //m+1 列
int n = 3; //n+1 行
int[][] temp = new int[m + 1][n + 1];
int i = 0; //二维数组横坐标
int j = 0; //二维数组纵坐标
int num = 1; //往数组里添的值 从1开始,到(m + 1) * (n + 1)
int x = 1; //坐标递增
int y = 0; //纵坐标变化
int t = 0; //由外向内第0圈
while (num <= (m + 1) * (n + 1)) {
temp[i][j] = new Integer(num).intValue();
//当y等于0时 i 不变化 turn(y)=1 所以 j会变化
//当x等于1时 坐标递增,x等于-1时 坐标递减
i += x * y;
j += x * turn(y);
//回到左上角 i,j都加1 由外向内进入下一圈,横坐标开始变化,坐标递增
if (i == j && i == t) {
t++;
i++;
j++;
x = 1;
y = 0;
}
//到达右上角,纵坐标开始变化
if (i == t && j == n - t) {
y = 1;
}
//到达左下角,纵坐标开始变化
if (i == m - t && j == t) {
y = 1;
}
//到达右下角,横坐标开始变化,坐标递减
if (i == m - t && j == n - t) {
x = -1;
y = 0;
}
num++;
}
//循环打印
for (int ii = 0; ii < (m + 1); ii++) {
for (int jj = 0; jj < (n + 1); jj++) {
System.out.print(temp[ii][jj] + "\t");
}
System.out.println("");
}
}
//转换方法,当一个坐标轴变化的时候另一个不变化
static int turn(int x) {
if (x == 1) {
return 0;
} else {
return 1;
}
}
m和n变化时可以输出不同的效果。
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
1 2 3 4 5
14 15 16 17 6
13 20 19 18 7
12 11 10 9 8
1 2 3 4
14 15 16 5
13 20 17 6
12 19 18 7
11 10 9 8
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