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;}
相关文章
相关标签/搜索