【试题 基础练习 回形取数】get到数组越界的问题,蛇形矩阵

问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转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.*;

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;
   }
}
 

 

  

 

 

posted @ 2020-03-30 15:13  wusheng_z  阅读(195)  评论(0编辑  收藏  举报