• 2021寒假每日一题《蛇形矩阵》


    蛇形矩阵

    题目来源:微软面试题
    时间限制:1000ms 内存限制:64mb

    题目描述

    输入两个整数n和m,输出一个\(n\)\(m\)列的矩阵,将数字 \(1\)\(n*m\) 按照回字蛇形填充至矩阵中。
    具体矩阵形式可参考样例。

    输入格式

    输入共一行,包含两个整数\(n\)\(m\)

    输出格式

    输出满足要求的矩阵。
    矩阵占\(n\)行,每行包含\(m\)个空格隔开的整数。

    数据范围

    \(1 ≤ n,m ≤ 100\)

    样例输入

    3 3
    

    样例输出

    1 2 3
    8 9 4
    7 6 5
    

    解题思路

    分析需要判断的格子,为上、下、左、右,四个格子。
    上、下、左、右,四个方向也是填数的方向。
    将上、右、下、左四个方向分别用0,1,2,3表示,即:上=0,右=1,下=2,左=3。
    所以先用一个二维数组来表示\(x\)\(y\)两个坐标的变化值,即:int[][] vec = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

    然后遍历所有格子即:遍历n*m个格子
    将数填入格子内,如果判定为撞墙了,则方向+1,如此进行下去。

    具体的判定方法在代码的注释里,如果有不明白的地方,欢迎在评论里告诉我。

    解题代码-Java

    import java.util.*;
    
    public class Main {
        public static void main(String[] args) {
            Scanner input = new Scanner(System.in);
            int n = input.nextInt();
            int m = input.nextInt();
            input.close();
            int[][] vec = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};  //表示4个方向x和y的变化值
            int[][] res = new int[n][m];  //保存结果的数组
            int x = 0, y = 0, d = 1;  //定义初始坐标和方向
            for (int i = 1; i <= n * m; i++) {  //遍历所有格子
                res[x][y] = i;  //将数填入格子
                int a = x + vec[d][0], b = y + vec[d][1];  //获取下一个格子的坐标
                if (a >= n || a < 0 || b >= m || b < 0 || res[a][b] != 0) {
                    //判断是否撞墙,以下是判定为撞墙的所有情况
                    //1.x坐标不在 [0-n] 区间内
                    //2.y坐标不在 [0-m] 区间内
                    //3.方向不变的下一个格子已经被填入了数字
                    //如果判定为撞墙,则改变方向,并更新下一个格子的坐标为更改方向后的下一个格子
                    d = (d + 1) % 4;
                    a = x + vec[d][0];
                    b = y + vec[d][1];
                }
                //将坐标改为下一个格子的坐标
                x = a;
                y = b;
            }
            for (int i = 0; i < n; i++) {  //循环输出二维数组
                for (int j = 0; j < m; j++) {
                    System.out.print(res[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
    
  • 相关阅读:
    java 3大特性
    注解@JsonIgnore和注解@JsonIgnoreProperties
    spring bean 的介绍
    Spring注解的实现原理和Spring常用注解介绍
    Spring中 @Component @Controller @Repository @Service 注解
    Java Collection集合中List,Set,Queue以及Map的使用
    Spring Security PasswordEncoder 密码校验和密码加密
    java中System.out.print()与System.out.println()与System.out.printf()的差别
    Arrays.fill 数组填充工具类
    Hashmap与Hashset的区别
  • 原文地址:https://www.cnblogs.com/hurentian/p/14293670.html
Copyright © 2020-2023  润新知