Java数组——回型数矩阵

问题描述

从键盘输入一个整数(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

方法一:设置四个方向

import java.util.Scanner;

public class HuiXingShu {
    private static final int RIGHT = 1;
    private static final int DOWN = 2;
    private static final int LEFT = 3;
    private static final int UP = 4;

    public static void main(String[] args) {
        /***
         * problem describe
         * 从键盘中输入1-20范围的整数,则以该数字为矩阵大小,把1,2,3,...n*n的数字按照顺时针螺旋的形式填入。
         */
        Scanner scan = new Scanner(System.in);
        System.out.print("请输入1-20的整数:");
        int num = scan.nextInt();
        int[][] huiXingShu = new int[num][num];
        int count = num * num;
        int dir = RIGHT;    //设置赋值的方向
        int i = 0, j = 0;
        //方法一:方向思路,设置四个方向
        for (int m = 1; m < count+1; m++) {
            switch (dir) {
                case RIGHT:
                    if (j < num && huiXingShu[i][j] == 0)
                        huiXingShu[i][j++] = m;
                    else {
                        dir = DOWN;
                        i++;
                        j--;
                        m--;    //因为运行这个else的时候m多加了
                    }
                    break;
                case DOWN:
                    if (i<num&&huiXingShu[i][j]==0)
                        huiXingShu[i++][j] = m;
                    else {
                        dir = LEFT;
                        i--;
                        j--;
                        m--;
                    }
                    break;
                case LEFT:
                    if(j>=0&&huiXingShu[i][j]==0)
                        huiXingShu[i][j--] = m;
                    else {
                        dir = UP;
                        j++;
                        i--;
                        m--;
                    }
                    break;
                case UP:
                    if(i>=0&&huiXingShu[i][j]==0)
                        huiXingShu[i--][j] = m;
                    else {
                        dir = RIGHT;
                        i++;
                        j++;
                        m--;
                    }
                    break;
            }
        }

        for(int[] Arr1:huiXingShu){
            for (int Arr2:Arr1){
                System.out.print(Arr2+"\t");
            }
            System.out.println();
        }
        System.out.println();

    }
}

方法二:根据下标赋值

//方向二:下标思路,根据下标来
        System.out.print("请输入1-20的整数:");
        int num1 = scan.nextInt();
        int[][] huiXingShu1 = new int[num1][num1];
        int maxX = num1-1;
        int minX = 0;
        int maxY = num1-1;
        int minY = 0;
        int cnt = 0;
        while (minX<=maxX){
            for(int y = minY;y<=maxY;y++)
                huiXingShu1[minX][y] = ++cnt;
            minX++;
            for(int x = minX;x<=maxX;x++)
                huiXingShu1[x][maxY] = ++cnt;
            maxY--;
            for(int y = maxY;y>=minY;y--)
                huiXingShu1[maxX][y] = ++cnt;
            maxX--;
            for(int x = maxX;x>=minX;x--)
                huiXingShu1[x][minY] = ++cnt;
            minY++;
        }

        for(int[] Arr1:huiXingShu1){
            for (int Arr2:Arr1){
                System.out.print(Arr2+"\t");
            }
            System.out.println();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值