朋友出的一道算法題,大概意思是:輸入任意一個數n,用二維數組打印出螺旋圖案(如上左圖,輸入5),算法
我本身的主要思想是分層,由外向內,一圈爲一層,而後每層又分爲上右下左(top-right-bottom-left)四個方向,每一個方向單獨畫。數組
過程當中遇到的問題:blog
1.啥時候結束循環?循環
當(sum-1)=(n*n)時。im
2.結束循環的條件判斷須要在哪兒寫?異常
剛開始我就在循環體最後面寫的,而後就一直拋異常了(哎,心累),後來我就在每一個方向畫完後,就寫了個結束循環的判斷。二維數組
來直接上代碼了(簡單實現了下):static
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;}