java實現:二維數組螺旋打印輸出

                                           

朋友出的一道算法題,大概意思是:輸入任意一個數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;}
相關文章
相關標籤/搜索