问题描述
资源限制

时间限制: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循环,让他重新依据下-右-上-左的顺序走
			}
		}
	}
}
}