朋友出的一道算法題,大概意思是:輸入任意一個數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("\n");
}
}
/**
* 螺旋展示
* @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;
}