朋友出的一道算法题,大概意思是:输入任意一个数n,用二维数组打印出螺旋图案(如上左图,输入5),
我自己的主要思想是分层,由外向内,一圈为一层,然后每层又分为上右下左(top-right-bottom-left)四个方向,每个方向单独画。
过程中遇到的问题:
1.啥时候结束循环?
当(sum-1)=(n*n)时。
2.结束循环的条件判断需要在哪儿写?
刚开始我就在循环体最后面写的,然后就一直抛异常了(哎,心累),后来我就在每个方向画完后,就写了个结束循环的判断。
来直接上代码了(简单实现了下):
public static void main(String[] args) {
int n = 5;
int a[][] = luoxuan(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(" " + a[i][j] + " ");
}
System.out.println(" ");
}
}
/**
* 螺旋展示
* @param n 任意数,负数默认为1.
* @return
*/
private static int[][] luoxuan(int n) {
if (n <= 0) {
n = 1;
}
int a[][] = new int[n][n];
int top = 0, bottom = n - 1;//上下
int left = 0, right = n - 1;//左右
int i = top, j = left;
int sum = 1;
while (true) {
//上
while (j != right + 1) {
a[i][j] = sum;
sum++;
j++;
}
j--;
if ((sum - 1) == (n * n)) {
break;//退出条件
}
top++;
i = top;
//右
while (i != bottom + 1) {
a[i][j] = sum;
sum++;
i++;
}
i--;
if ((sum - 1) == (n * n)) {
break;
}
right--;
j = right;
//下
while (j != left - 1) {
a[i][j] = sum;
sum++;
j--;
}
j++;
if ((sum - 1) == (n * n)) {
break;
}
bottom--;
i = bottom;
//左
while (i != top - 1) {
a[i][j] = sum;
sum++;
i--;
}
i++;
if ((sum - 1) == (n * n)) {
break;
}
left++;
j = left;
}
System.out.println("n="+n+",i=" + i + ",j=" + j + ",sum=" + sum);
return a;
}