蓝桥杯_基础练习_回形取数
题目描述
问题
回形取数就是沿矩阵的边取数
,若当前方向上无数可取或已经取过,则左转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
问题解决
主要思路
- 问题是一个遍历矩阵,我们可以使用一个数组
vis[][]
来记录矩阵遍历的情况,避免重复遍历。 - 按照问题,遍历矩阵方向顺序是
下
、右
、上
、左
。所以我们可以通过四个方向的循环来遍历矩阵。 - 比较简单,具体看代码注释把。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int m =scanner.nextInt();//行数
int n = scanner.nextInt();//列数
//需要遍历的数组
int[][] a = 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++) {
a[i][j]=scanner.nextInt();
}
}
//首先输出第一个元素,来契合我门之后的判断条件
System.out.print(a[1][1]);
vis[1][1]=1;//如果这个元素被遍历过,就将此位置置为 1,避免重复遍历
int sum=1;
int i=2,j=1;//循环遍历从第一列,第二行开始
//我们最外围的循环,是控制是否遍历完
while (sum<n*m) {
//通过判断条件判断 现在行数是否大于矩阵行数 以及 这个位置是否遍历过
while (i<=m&&vis[i][j]==0) {
System.out.print(" "+a[i][j]);
vis[i][j]=1;
i++;sum++;
}
i--;j++;//单方向遍历完 不减掉 1 ,会发生越界
while (j<=n&&vis[i][j]==0) {
System.out.print(" "+a[i][j]);
vis[i][j]=1;
j++;sum++;
}
j--;i--;
while (i >= 1&& vis[i][j]==0) {
System.out.print(" "+a[i][j]);
vis[i][j]=1;
i--;sum++;
}
i++;j--;
while (j>=1&&vis[i][j]==0) {
System.out.print(" "+a[i][j]);
vis[i][j]=1;
j--;sum++;
}
j++;i++;
}
}
}