问题描述
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
样例输出
1 4 7 8 9 6 3 2 5
样例输入
3 2
1 2
3 4
5 6
样例输出
1 3 5 6 4 2
解题思路
使用矩阵搜索,让他重新依据下-右-上-左的顺序取数
参考代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
int n = sr.nextInt();
int m = sr.nextInt();
//创建数字矩阵
int[][] map = new int[n][m];
//验证矩阵(用来验证此位置是否访问过)
boolean[][] check = new boolean[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
map[i][j] = sr.nextInt();
}
}
//取数坐标:
int x = 0, y = 0;
//下右上左
int[] dx = {1,0,-1,0};
int[] dy = {0,1,0,-1};
//从第一个位置开始
check[0][0] = true;
System.out.print(map[0][0]+" ");
//朝四个方向取数:优先级(下右上左)
for (int i = 0; i < 4; i++) {
if (i == 3 &&!check[x][y-1]) {//左
//向左,无视方向直接往左莽,直到碰到已取出的数
while (!check[x][y-1]) {
check[x][y-1] = true;
System.out.print(map[x][y-1]+" ");
y--;
}
i = -1;//重置for循环,让他重新依据下-右-上-左的顺序走
}else{
//试试新的坐标
int nx = x + dx[i];
int ny = y + dy[i];
//在合法边界循环取数
if (nx < n && ny < m && nx >= 0 && ny >= 0 && !check[nx][ny]) {
System.out.print(map[nx][ny]+" ");
check[nx][ny] = true;//取数完标记成访问过,下次就不访问了
x = nx;
y = ny;
i = -1;//重置for循环,让他重新依据下-右-上-左的顺序走
}
}
}
}
}