java 以螺旋顺序打印二维数组

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7840389/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 21:39:08  来源:igfitidea点击:

print 2-D array in spiral order

javaarraysspiral

提问by scoohh

Possible Duplicate:
Pattern consisting of numbers moving in clockwise direction around a rectangular shape (length and breadth decreasing each time)

可能的重复:
由围绕矩形沿顺时针方向移动的数字组成的图案(长度和宽度每次减小)

How to print a 2 dimensional array in spiral order using JAVA? Please help, I don't have any idea.

如何使用 JAVA 按螺旋顺序打印二维数组?请帮忙,我不知道。

sample array:

样本数组:

1  2  3  4

5  6  7  8

9  10 11 12

13 14 15 16

output:

输出:

1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10

here is what i tried:

这是我尝试过的:

public static void main(String[] args) {

公共静态无效主(字符串 [] args){

    int[][] values = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16}};

    for (int i = (values.length * values[0].length)-1, j = 0; i > 0; i--, j++) {
          for (int k = j; k < i; k++) {
              System.out.print(values[j][k]);
          }

          for (int k = j; k < i; k++) {
              System.out.print(values[k][i]);
          }

          for (int k = i; k > j; k--) {
              System.out.print(values[i][k]);
          }

          for (int k = i; k > j; k--) {
              System.out.print(values[k][j]);
          }
    }

}

回答by Vlad

void PrintSpiral(int[][] arr, int size)
{
    for (int l = 0; l < size / 2; l++)
    {
        int min = l;
        int max = size - 1 - l;
        for (int i = min; i < max; i++)
            System.out.print("\t" + arr[i][min].ToString());
        for (int j = min; j < max; j++)
            System.out.print("\t" + arr[max][j].ToString());
        for (int i = max; i > min; i--)
            System.out.print("\t" + arr[i][max].ToString());
        for (int j = max; j > min; j--)
            System.out.print("\t" + arr[min][j].ToString());
    }
    // centre is special case: avoiding printing it 4 times.
    if (size % 2 == 1)
        System.out.print("\t" + arr[size / 2][size / 2].ToString());
}

(disclaimer: tried only on C#)

(免责声明:仅在 C# 上尝试过)

回答by Daniel

here is some Java solution:

这是一些Java解决方案:

public static final int X_SIZE = 4;
public static final int Y_SIZE = 4;

public static void main(String[] args) {
    int[][] array = new int[X_SIZE][Y_SIZE];

    for(int i = 0; i < X_SIZE; i++){
        for (int j = 0; j < Y_SIZE; j++){
            array[i][j] = i * X_SIZE + (j + 1);
            System.out.print(array[i][j] + " ");
        } 
        System.out.println();
    }

    System.out.println("************");
    System.out.println("Spiral");       

    spiralPrint(X_SIZE, Y_SIZE, array);
}

public static void spiralPrint(int xSize, int ySize, int matrix[][]){
    int i,  k = 0, l = 0;
    xSize--;  ySize--;      

    while(k <= xSize && l <= ySize){
        for(i = l; i <= ySize; ++i) {
            System.out.print(matrix[k][i]+ " ");
        }           
        k++;

        for(i = k; i <= xSize; ++i) {
            System.out.print(matrix[i][ySize] + " ");
        }
        ySize--;

        for(i = ySize; i >= l; --i) {
                System.out.print(matrix[xSize][i] + " ");
        }
        xSize--;


        for(i = xSize; i >= k; --i) {
            System.out.print(matrix[i][l] + " ");
        }
        l++;
    }
}