【试题 基础练习 回形取数】get到数组越界的问题,蛇形矩阵
问题描述
回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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; } }
不忘初心,方得始终。只有走过弯路,才更确信当初最想要的是什么。