回型数

九落 / 2023-08-01 / 原文


/**
 *
 * 从键盘输入一个整数(1~20) ,则以该数字为矩阵的大小,把 1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
 *
 * 例如: 输入数字2,则程序输出:
 * 1 2
 * 4 3
 * 输入数字3,则程序输出:
 * 1 2 3
 * 8 9 4
 * 7 6 5
 * 输入数字4, 则程序输出:
 * 1   2   3   4
 * 12  13  14  5
 * 11  16  15  6
 * 10  9   8   7
 *
 * 解决思路1:
 * 输入数字:len
 * 行: i [0, len]
 * 列:j [0, len]
 * 值:m [1, len * len]
 *
 * 1、如何表示     上行   右列   下行   左列?
 * 可以设置参数k。  k=1   k=2   k=3   k=4
 *
 * 2、不同 k 之间转换的边界条件?
 * 1 2 3 4 5
 * j >= len ,
 * 则
 * k = 2, i++, j--   m--(因为此时m = 5,下次循环赋值时又要m++,因此要m--)
 *
 * k = 3, k = 4, k = 1 之间转换条件类似
 *
 *
 * 解决思路2(与 1 类似):
 * 四个角分别为 minX minY maxX maxY 判断转角边界条件即可
 */
public class Test6 {

    @Test
    public void test1(){
        //System.out.println("输入一个数字:");
        //如果非数字,则报错(略)
        //Scanner scanner = new Scanner(System.in);
        //int len = scanner.nextInt();
        int len = 4;
        int[][] arr = new int[len][len];

        //行 列
        int i = 0, j = 0;
        //行列转换
        int k = 1;

        for (int m = 1; m <= len * len; m++) {
            if (k == 1){
                if (j < len && arr[i][j] == 0){
                    arr[i][j++] = m;
                }else {
                    k = 2;
                    i++;
                    j--;
                    m--;
                }
            }else if (k == 2){
                if (i < len && arr[i][j] == 0){
                    arr[i++][j] = m;
                }else {
                    k = 3;
                    i--;
                    j--;
                    m--;
                }
            }else if (k == 3){
                if (j >= 0 && arr[i][j] == 0){
                    arr[i][j--] = m;
                }else {
                    k = 4;
                    i--;
                    j++;
                    m--;
                }
            }else if (k == 4){
                if (i >= 0 && arr[i][j] == 0){
                    arr[i--][j] = m;
                }else {
                    k = 1;
                    i++;
                    j++;
                    m--;
                }
            }
        }


        for(int m = 0; m < arr.length; m++){
            for(int n = 0; n < arr[m].length; n++){
                System.out.print(arr[m][n] + "\t");
            }
            System.out.println();
        }


    }
}

思路2:

	@Test
    public void test2(){
       int n = 7;
       int[][] arr = new int[n][n];

       int count = 0;
       int minX = 0;
       int minY = 0;
       int maxX = n - 1;
       int maxY = n - 1;

       while (minX <= maxX){
           //到右
           for (int x = minX; x <= maxX; x++){
                arr[minY][x] = ++count;
           }
           minY++;

           //到下
           for (int y = minY; y <= maxY; y++){
               arr[y][maxX] = ++count;
           }
           maxX--;

           //到左
           for (int x = maxX; x >= minX; x--){
               arr[maxY][x] = ++count;
           }
           maxY--;

           //到上
           for (int y = maxY; y >= minY; y--){
               arr[minX][y] = ++count;
           }
           minX++;
       }

       //循环输出
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                String space = (arr[i][j]+"").length()==1 ? "0":"";
                System.out.print(space+arr[i][j]+" ");
            }
            System.out.println();
        }

    }