问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。
输出格式
输出只有一行,共mn个数,为输入矩阵回形取数得到的结果。数之间用一个空格分隔,行末不要有多余的空格。
样例输入
3 3
1 2 3
4 5 6
7 8 9
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 2
3 4
5 6
样例输出
1 3 5 6 4 2
import java.util.*;
public class Main {
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
int arr[][] = new int[n+n][m+m];
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++) arr[i][j]=-1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
arr[i][j]=sc.nextInt();
int T = n*m;
int i=1;
int j=1;
while(T!=0){
if(i==1&&arr[1][1]>0) {
System.out.print(arr[1][1]);
arr[1][1]=-1;
}
while(arr[++i][j]>0&&i<=n){///向下
System.out.print(" "+arr[i][j]);
arr[i][j]=-1;
T--;
}
i--;///加多1跳出循环,要减去多的1
while(arr[i][++j]>0&&j<=m){///向右
System.out.print(" "+arr[i][j]);
arr[i][j]=-1;
T--;
}
j--;
while(arr[--i][j]>0&&i>=1){///向上
System.out.print(" "+arr[i][j]);
arr[i][j]=-1;
T--;
}
i++;
while(arr[i][--j]>0&&j>=1){///向左
System.out.print(" "+arr[i][j]);
arr[i][j]=-1;
T--;
}
j++;
}
}
}
注意:上面这种做法是超时的,所以不建议,还有一个问题,在java中,数组下标不允许出现-1的,否则会出现ArrayIndexOutOfBoundsException异常(数组越界 -->>指使用非法索引访问数组。索引为负值或大于或等于数组的大小。)
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.*;
public class Main {
static int dr[]={1,0,-1,0};///向下加,向上减
static int dc[]={0,1,0,-1};///向左加,向右减
static int arr[][];
static int n,m;
public static void main(String [] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
arr = new int[n + 10][m + 10];
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
arr[i][j] = sc.nextInt();
int T = 0;
int r, c, x, y, i;
//PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));///这样定义输出,可以减少运行时间,提高效率
//out.print(arr[0][0]);
System.out.print(arr[0][0]);
arr[0][0]=-1;
r = 0;
c = 0;
i=0;
while (++T<n*m) {
while(true){
x=r+dr[i];
y=c+dc[i];
if(panduan(x,y)&&arr[x][y]!=-1){///先进行panduan方法,防止报错,数组越界
//out.print(" "+arr[x][y]);
System.out.print(" "+arr[x][y]);
r=x;
c=y;
arr[x][y]=-1;
break;
}
i++;
if(i>=4) i-=4;///循环一周结束
}
}
//out.println();
//out.flush();
}
static boolean panduan(int r,int c){
return r>=0 && r<n && c>=0 &&c<m;
}
}