Description

螺旋方阵

Input
一个整数n(0<n<10)

Output
一个n行方阵,每行n个数,每个数场宽为3

Sample Input 1

5
Sample Output 1

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
代码如下:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] arr = new int[n][n];
        Spiral(arr);
    }

    public static void Spiral(int arr[][]) {

        /*令行为i,列为j,从0开始计数
        观察可知
        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
        第零行1 2 3 4行不变,列递增
        第四列5 6 7 8列不变,行递增
        第四行9 10 11 12行不变,列递增
         */
        int num = 1;
        int q = 0;//循环的圈数
        while (true) {
            //第一个循环,行不变,列递增
            for (int i = q; i < q + 1; i++) {//保持行不变
                for (int j = q; j < arr.length - 1 - q; j++) {
                    arr[i][j] = num;
                    num++;
                }
            }
        /*
        1 2 3 4 0
        0 0 0 0 0
        0 0 0 0 0
        0 0 0 0 0
        0 0 0 0 0
         */
            //列不变,行递增
            for (int j = arr.length - 1 - q; j < arr.length - q; j++) {
                for (int i = q; i < arr.length - 1 - q; i++) {
                    arr[i][j] = num;
                    num++;
                }
            }
        /*
        1 2 3 4 5
        0 0 0 0 6
        0 0 0 0 7
        0 0 0 0 8
        0 0 0 0 0
         */
            for (int i = arr.length - 1 - q; i < arr.length- q; i++) {
                for (int j = arr.length - 1 - q; j > q; j--) {
                    arr[i][j] = num;
                    num++;
                }
            }
        /*
        1  2  3  4  5
        0  0  0  0  6
        0  0  0  0  7
        0  0  0  0  8
        0 12 11 10  9
         */
            for (int j = q; j < 1 + q; j++) {
                for (int i = arr.length - 1 - q; i > q; i--) {
                    arr[i][j] = num;
                    num++;
                }
            }
        /*
        1  2  3  4  5
        16 0  0  0  6
        15 0  0  0  7
        14 0  0  0  8
        13 12 11 10  9
         至此第一圈的循环结束*/
            q++;//圈数增加,开始内圈循环
            if (q == arr.length / 2) {//当螺旋到达矩阵最中间,可以结束循环
                //当是奇数矩阵时,循环到最后一圈中间有一个数
                if (arr.length % 2 == 1) {
                    arr[arr.length / 2][arr.length / 2] = num;
                }
                break;
            }

        }
        //遍历数组输出
        for(int i=0;i< arr.length;i++){
            for(int j=0;j< arr.length;j++) {
                System.out.printf("%3d", arr[i][j]);
            }
                System.out.printf("\n");//换行
            }
        }
    }

结果如下:

该代码主要是观察数据递增方向与圈数,找出之间的联系,控制行(列)不变,让列(行)进行递增,由此根据四个方向的循环,并一圈圈往内层推进。
本文参考以下链接:http://t.csdnimg.cn/slLTj


波波鱼
4 声望3 粉丝