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; //标记这个坐标点已经取过
}
}
}