BASIC-25 回形取数

BASIC-25 回形取数

题目

资源限制

时间限制:1.0s 内存限制:512.0MB

问题描述

回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转 90 度。一开始位于矩阵左上角,方向向下。

输入格式

输入第一行是两个不超过 200 的正整数 m, n,表示矩阵的行和列。接下来 m 行每行 n 个整数,表示这个矩阵。

输出格式

输出只有一行,共 mn 个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。

样例输入 1

3 3
1 2 3
4 5 6
7 8 9

样例输出 1

1 4 7 8 9 6 3 2 5

样例输入 2

3 2
1 2
3 4
5 6

样例输出 2

1 3 5 6 4 2

题解

import java.util.Scanner;

public class BASIC_25 {
    static int[][] dir = new int[][] { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; // 右下左上

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt(), n = sc.nextInt();
        int[][] map = new int[m][n];
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                map[i][j] = sc.nextInt();
        sc.close();

        int x = -1, y = 0, d = 0, sum = 0;
        while (sum < m * n) {
            sum++;
            int nx = x + dir[d][0], ny = y + dir[d][1];// 看dir数组的解释
            if (nx < 0 || ny < 0 || nx >= m || ny >= n || map[nx][ny] == -1) {// 出范围或撞到已取过的点,方向上做出改变
                d = (d + 1) % 4;//
                x += dir[d][0];
                y += dir[d][1];
            } else {
                x = nx;
                y = ny;
            }
            System.out.print(map[x][y] + " ");
            map[x][y] = -1; //标记这个坐标点已经取过
        }
    }
}
posted @ 2022-03-19 14:50  morning-start  阅读(31)  评论(0编辑  收藏  举报