1、螺旋矩阵

1、题干

所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。

输入格式: 一个数字N,与一个数字M(N<30,M<900)

输出格式: M在N*N的螺旋方阵中的行列数

输出样例:

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 

结尾无空行

2、思路

无非是转圈赋值,因此只要知道前进的方向、和前进的长度,即可用for循环把值填进去,前进方向和长度可以简单找规律得到

3、解题

1、复杂度为O(n^3)

可以列出行号、列号与圈数,然后找出它们的关系
在这里用行号与列号的变换来直接表示前进的方向与长度

 public static void matrix(int n , int m) {
        int[][] ints = new int[n][n];

        if (n >= 30 || m >= 900) {
            System.out.println("请重新输入,n或者m超过上限");
            return;
        }
        //cnt表示第几个数
        //circle表示转了几圈
        //i为行号,j为列号
        //根据行号、列号与圈数的关系构造矩阵
        int cnt = 1, circle = 0, i = 0, j = 0;
        while (cnt <= n * n) {
            for (j = circle; j <= n - 1 - circle; j++) {
            //检验是否是要找的数
                if (cnt==m) {
                    System.out.println((i +1)+ " " + (j+1));
                    cnt = n*n+1;
                    break;
                }
                ints[i][j] = cnt++;
            }
            //为true说明已找到
            if (cnt>n*n)
                break;
            j--;
            for (i = i + 1; i <= n - 1 - circle; i++) {
                if (cnt==m) {
                    System.out.println((i +1)+ " " + (j+1));
                    cnt = n*n+1;
                    break;
                }
                ints[i][j] = cnt++;
            }
            if (cnt>n*n)
                break;
            i--;
            for (j = j - 1; j >= circle; j--) {
                if (cnt==m) {
                    System.out.println((i +1)+ " " + (j+1));

                    cnt = n*n+1;
                    break;
                }
                ints[i][j] = cnt++;
            }
            if (cnt>n*n)
                break;
            j++;
            for (i = i - 1; i >= 1 + circle; i--) {
                if (cnt==m) {
                    System.out.println((i +1)+ " " + (j+1));

                    cnt = n*n+1;
                    break;
                }
                ints[i][j] = cnt++;
            }
            if (cnt>n*n)
                break;
            i++;
            circle++;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值