java 下使用数组实现螺旋队列

53 阅读1分钟

螺旋数组主要是掌握好双 for 循环和二维数组 i j 之间的关系,下面三道题有助于更好的理解,最好还是能把具体的坐标变换亲自写一下,找出之间的规律。

第一题

设计一个二维数组,按图示输出。(蛇形数组)
1  2  6  7
3  5  8 13
4  9 12 14
10 11 15 16

方法一

分析:

分两块处理,先处理左上三角,再处理右下三角

image-20230313231125388.png image-20230313231133275.png

代码:

public class homework_2_3 {
    public static void main(String[] args) {
        int a[][] = new int[4][4];
​
        int num = 1;
​
        //左上三角
        for(int i = 0 ; i < 4 ; i++){
            for (int j = 0 ; j <= i ; j++){
                if( i % 2 == 0 ){
                    a[i-j][j] = num;
                }else{
                    a[j][i-j] = num;
                }
                num += 1;
            }
        }
        //右下三角
        for(int i = 0 ; i < 3 ; i++){
            for (int j = i+1 ; j < 4 ; j++){
                if( i % 2 == 0 ){
                    a[i-j+4][j] = num;
                }else{
                    a[j][i-j+4] = num;
                }
                num += 1;
            }
        }
​
        for (int i = 0; i<a.length ; i++){
            for (int j = 0 ; j<a[i].length ; j++){
                String str = String.format("%2d ",a[i][j]);
                System.out.print(str);
            }
            System.out.println();
        }
    }
}

方法二:

分析: (图片晚上补)

代码

public class homework_2_3_1 {
    public static final int N = 10;

    public static void main(String[] args) {
        int a[][] = new int[N][N];
        int x = 1;

        //最外层循环,为斜向循环的行数
        //左上三角
        for (int n = 0; n < N ; n++) {
            if (n % 2 == 0) {
                //偶数行从左下到右上推进
                for (int i = n, j = 0; i >= 0; i--, j++) {
                    a[i][j] = x;
                    x++;
                }
            }else {
                //奇数行从右上到左下推进
                for (int i = 0, j = n; j >= 0; i++, j--) {
                    a[i][j] = x;
                    x++;
                }
            }
        }

        //右下三角
        for (int n = N; n < 2*N-1 ; n++) {
            if (n % 2 == 0) {
                //偶数行从左下到右上推进
                for (int i = N - 1, j = n+1-N ; j <= N-1 ; i--, j++) {
                    a[i][j] = x;
                    x++;
                }
            }else {
                //奇数行从右上到左下推进
                for (int i = n+1-N , j = N-1; i<=N-1 ; i++, j--) {
                    a[i][j] = x;
                    x++;
                }
            }
        }



        for (int i = 0; i<a.length ; i++){
            for (int j = 0 ; j<a[i].length ; j++){
                String str = String.format("%2d ",a[i][j]);
                System.out.print(str);
            }
            System.out.println();
        }

    }
}

输出:

image-20230313225306321.png

第二题

设计一个二维数组,按图示输出。
1  2  9 10
4  3  8 11
5  6  7 12
16 15 14 13

分析:

将图形拆成4层,寻找顺序输出的坐标和 i j 输出坐标的关系。

蓝色的字是按照顺序每层输出的坐标,黑色的字是实际双 for 循环输出的坐标,对比关系。

image-20230313224824979.png

代码实现

缺陷:无法实现指定N输出相应规律图形,仅可以输出题上图形

public class homework_2_4 {
    public static void main(String[] args) {
        int a[][] = new int[4][4];
​
        int num = 2;
        //第一层
        a[0][0] =1;
        //第二层
        for (int i = 0; i< 2; i++){
            for (int j = 1; j>=0; j--){
                if(i<=0 && j<=0){
                }else {
                    a[i][j] = num;
                    num +=1;
                }
            }
        }
        //第三层
        for (int i = 2; i>=0; i--){
            for (int j = 0; j< 3; j++){
                if(i<=1 && j<=1){
                }else {
                    a[i][j] = num;
                    num +=1;
                }
            }
        }
        //第四层
        for (int i = 0; i<4 ; i++){
            for (int j = 3; j>=0; j--){
                if(i<=2 && j<=2){
                }else {
                    a[i][j] = num;
                    num +=1;
                }
            }
        }
​
​
        for (int i = 0; i<a.length ; i++){
            for (int j = 0 ; j<a[i].length ; j++){
                String str = String.format("%2d ",a[i][j]);
                System.out.print(str);
            }
            System.out.println();
        }
    }
}

输出:

image-20230313224633979.png

第三题

设计一个二维数组,按图示输出螺旋状元素:
1   2   3   4   5
16  17  18  19  6
15  24  25  20  7
14  23  22  21  8
13  12  11  10  9

方法借鉴了blog.csdn.net/qq_36631580…

image-20230313231626838.png

代码:

public class homework_2_5 {
    public static void main(String[] args) {
        int N = 5;
        int a[][] = new int[N][N];
        int right = 1,down = 2, left = 3, up = 4;
        int d = right;
        int m = 0,n = 0;
​
        for(int step = 1 ; step <= N*N ; step++) {
            a[m][n] = step;
​
            if (d == right) {
                if (n + 1 < N && a[m][n + 1] == 0) {
                    n++;
                } else {
                    m++;
                    d = down;
                    continue;
                }
            }
​
            if (d == down) {
                if (m + 1 < N && a[m + 1][n] == 0) m++;
                else {
                    n--;
                    d = left;
                    continue;
                }
            }
​
            if (d == left) {
                if (n - 1 >= 0 && a[m][n - 1] == 0) n--;
                else {
                    m--;
                    d = up;
                    continue;
                }
            }
​
            if (d == up) {
                if (m - 1 >= 0 && a[m - 1][n] == 0) m--;
                else {
                    n++;
                    d = right;
                    continue;
                }
            }
        }
​
        for (int i = 0; i<a.length ; i++){
            for (int j = 0 ; j<a[i].length ; j++){
                String str = String.format("%2d ",a[i][j]);
                System.out.print(str);
            }
            System.out.println();
        }
​
    }
}

输出:

image-20230313231531010.png