问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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 sc=new Scanner(System.in);
//接收输入
int m=sc.nextInt();
int n=sc.nextInt();
int[][] arr=new int[m][n];
for(int i=0;i<m;i++) {
for(int j=0;j<n;j++) {
arr[i][j]=sc.nextInt();
}
}
//定义二维数组的索引,总数
int i=0,j=0,count=0;
//
int length_L = 0,length_R = 0,length_m = m,length_n = n;
while(true){
//此时认为全部找完了.跳出循环
if(count == m * n){
break;
}
//四个while,分别输出于第一列,最后一行,最后一列,第一行,,,这样就完成了一圈,然后依靠外层循环,来找下一圈,
//已经输出的数标记为-1,避免重复使用
int x= length_L,y= length_R;
while(true){
if(arr[x][y] != -1){
System.out.print(arr[x][y] + " ");
arr[x][y] = -1;
count++;
if(x < length_m-1)
x++;
else
break;
}
}
//System.out.println("-----------");
while(true){
if(arr[x][y] != -1){
System.out.print(arr[x][y] + " ");
arr[x][y] = -1;
count++;
}
if(y < length_n-1)
y++;
else
break;
}
//System.out.println("-----------");
while(true){
//System.out.println(x+" " + y+"..");
if(arr[x][y] != -1){
System.out.print(arr[x][y] + " ");
count++;
arr[x][y] = -1;
}
if(x > length_R)
x--;
else
break;
}
//System.out.println("-----------");
while(true){
//System.out.println(x+" " + y+"..");
if(arr[x][y] != -1){
System.out.print(arr[x][y] + " ");
count++;
}
if(y > length_R)
y--;
else
break;
}
//找完外圈,减少范围
length_L++;length_R++;
length_m--;length_n--;
}
}
}