Acwing 756. 蛇形矩阵

输入两个整数 n n n m m m,输出一个 n n n m m m列的矩阵,将数字 1 1 1 n × m n×m n×m按照回字蛇形填充至矩阵中。

具体矩阵形式可参考样例。

输入格式
输入共一行,包含两个整数 n n n m m m

输出格式
输出满足要求的矩阵。

矩阵占 n n n行,每行包含 m m m个空格隔开的整数。

数据范围
1 ≤ n , m ≤ 100 1≤n,m≤100 1n,m100
输入样例:

3 3

输出样例:

1 2 3
8 9 4
7 6 5

思路
这题之前好像见过,怎么搞的忘了
网上大佬思路:

代码

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[][] M = new int[100][100];
        int[][] d = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int l = -1, r = m, h = -1, b = n;
        int cnt = 0;
        for(int k = 1, i = 0, j = 0; k <= n * m; ){
            int ni = i + d[cnt][0], nj = j + d[cnt][1];
            if(nj == r) h ++;
            else if(ni == b) r --;
            else if(nj == l) b --;
            else if(ni == h) l ++;
            else{
                M[i][j] = k;
                k++;
                i = ni;
                j = nj;
                continue;
            }
            cnt = (cnt + 1) % 4;
        }
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < m; j++){
                if(j != 0) System.out.print(" ");
                System.out.print(M[i][j]);
            }
            System.out.println();
        }
    }
}

y总代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[][] res = new int[n][m];
        int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
        int x = 0, y = 0, d = 1;
        for (int i = 1; i <= n * m; i ++ ) {
            res[x][y] = i;
            int a = x + dx[d], b = y + dy[d];
            if (a < 0 || a >= n || b < 0 || b >= m || res[a][b] > 0) {
                d = (d + 1) % 4;
                a = x + dx[d];
                b = y + dy[d];
            }
            x = a;
            y = b;
        }

        for (int i = 0; i < n; i ++ ) {
            for (int j = 0; j < m; j ++ )
                System.out.printf("%d ", res[i][j]);
            System.out.println();
        }
    }
}
  • 23
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值