zoukankan      html  css  js  c++  java
  • java实现:二维数组螺旋打印输出

                                               

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

    }

    /**
    * 螺旋展示
    * @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;
    }
    万物皆有裂痕,那是光进来的地方。
  • 相关阅读:
    socket 第一课
    _getitem__ __setitem__ __delitem__ __len__
    单继承&多继承 注意点
    面对对象 类&对象
    异常检测
    模块导入
    序列化模块注意点 json&pickle
    re模块
    filter和map
    Maven入门
  • 原文地址:https://www.cnblogs.com/VweiweiyixiaoV/p/6292974.html
Copyright © 2011-2022 走看看