题解 | #顺时针打印数字矩阵#

顺时针打印数字矩阵

https://www.nowcoder.com/practice/ce0c22a435114108bd9acc75f81b5802?tpId=149&tqId=33975&rp=1&ru=/ta/exam-bilibili&qru=/ta/exam-bilibili&difficulty=&judgeStatus=&tags=/question-ranking

思路

整体可以分为四个状态,如果按照当前状态行进,下一个块如果不合法,或者已经被走过,则转向。只需要对(2,1)块特判下即可(可以自己模拟一下试试)。


import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    static int n ;
    static int m ;
    static boolean[][] vis;
    static boolean check(int x, int y) {
        return x >= 1 && x <= n && y >= 1 && y <= m;
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (true) {
            n = in.nextInt();
            m = in.nextInt();
            if (n == -1)
                break;
            int[][] map = new int[n + 1][m + 1];
            vis = new boolean[n + 1][m + 1];
            for (int i = 1; i <= n; i++) {
                for (int j = 1 ; j <= m; j++) {
                    map[i][j] = in.nextInt();
                }
            }
            int now = 0;
            int i = 1;
            int j = 1;
            int status = 1;
            while (now < n * m) {
                now ++;
                vis[i][j] = true;
                if (now == n * m) {
                    System.out.print(map[i][j]);
                } else {
                    System.out.print(map[i][j] + ",");
                }
                if (status == 1) {
                    if (!check(i, j + 1) || vis[i][j + 1]) {
                        status = 2;
                        i ++;
                    } else {
                        j ++;
                    }
                } else if (status == 2) {
                    if (!check(i + 1, j) || vis[i + 1][j]) {
                        status = 3;
                        j--;
                    } else {
                        i++;
                    }
                } else if (status == 3) {
                    if (!check(i, j - 1) || vis[i][j - 1]) {
                        status = 4;
                        i--;
                    } else {
                        j--;
                    }
                } else if (status == 4) {
                    if (!check(i - 1, j ) || vis[i - 1][j ]) {
                        status = 1;
                        j++;
                    } else {
                        i--;
                    }
                }
            }
            System.out.println();
        }
    }
}

全部评论

相关推荐

03-18 09:45
莆田学院 golang
牛客749342647号:佬,你这个简历模板是哪个,好好看
点赞 评论 收藏
分享
03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务