蓝桥杯VIP试题 之 基础练习 回形取数 JAVA实现
蓝桥杯
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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
思路:按照下,右,上,左的方向进行遍历,如果没被做标记(flag[i][j]!=1),就输出,并且做标记(flag[i][j]=1)。防止被二次输出。
import java.util.Scanner;
public class 回形取数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int a[][] = new int[m+1][n+1];
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
a[i][j] = sc.nextInt();
}
}
//用flag记录这个数是否被遍历过
//如果直接用数组a遍历里面的数是否被遍历过,
//可能数组a里面的数据有1,就不准确
int flag[][] = new int[m+1][n+1];
//因为最后没有空格输出,所以先输出一个数,后面的用" "+输出
//从第一行零列开始
int i = 1,j = 0;
System.out.print(a[0][0]);
//sum记录输出 的个数,因为输出了一个数,所以sum=1
int sum = 1;
flag[0][0] = 1;
//一个输出n*m个,所以sum<n*m
while(sum<n*m) {
//向下遍历,
while(i<m&&flag[i][j]!=1) {
System.out.print(" "+a[i][j]);
flag[i][j] = 1;
i++;sum++;
}
//因为最后一遍i又加了一次,所以i--,
i--;j++;
//向右遍历
while(j<n&&flag[i][j]!=1) {
System.out.print(" "+a[i][j]);
flag[i][j] = 1;
j++;sum++;
}
j--;i--;
//向上遍历
while(i>=0&&flag[i][j]!=1) {
System.out.print(" "+a[i][j]);
flag[i][j] = 1;
i--;sum++;
}
j--;i++;
//向左遍历
while(j>=0&&flag[i][j]!=1) {
System.out.print(" "+a[i][j]);
flag[i][j] = 1;
j--;sum++;
}
j++;i++;
}
}
}