朋友出的一道算法题,大概意思是:输入任意一个数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;}