问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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 回形取数 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
int a[][]=new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
a[i][j]=sc.nextInt();
}
}
int flag[][]=new int[m][n];//标记访问过的数组
int sum=0;//这个记录输出的个数
int i=0,j=0;
while (sum<n*m) { //向下遍历
while (i<m&&flag[i][j]!=1) {
System.out.print(a[i][j]+" ");
flag[i][j]=1;
i++;sum++;
}
i--;j++;//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++;
}
i++;j--;
while (j>=0&&flag[i][j]!=1) {
System.out.print(a[i][j]+" ");
flag[i][j]=1;
j--;sum++;
}
j++;i++;
}
}
}