题目描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
题解
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 下右上左
int[] dx = {1,0,-1,0};
int[] dy = {0,1,0,-1};
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int[][] matrix = new int[m+1][n+1];
int[][] vis = new int[m+1][n+1];
// 输入矩阵
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
matrix[i][j] = sc.nextInt();
int sum = 1;
int x = 1,y = 1,choice = 0;
int nx,ny; vis[x][y] = 1;
System.out.print(matrix[x][y]+" ");
while(sum<m*n)
{
nx = x+dx[choice];
ny = y+dy[choice];
sum++;
// 判断越界没越界
if(nx<1 || ny<1 || nx>m || ny>n || vis[nx][ny]==1)
{
choice = (choice+1)%4;
x = x+dx[choice];
y = y+dy[choice];
}
else
{
x = nx; y =ny; vis[x][y] = 1;
}
if(sum!=(m*n)) System.out.print(matrix[x][y]+" ");
else System.out.print(matrix[x][y]);
}
}
}