zoukankan      html  css  js  c++  java
  • 【试题 基础练习 回形取数】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;
       }
    }
     
    

      

    不忘初心,方得始终。只有走过弯路,才更确信当初最想要的是什么。
  • 相关阅读:
    Finalize,Dispose,SuppressFinalize
    防火防盗防微软,Firefox发布插件自动检测服务
    Nginx的Rewrite设置及示例
    Linux游戏开发包 ClanLib 2.1.0 发布
    HTTP协议详解(真的很经典)
    Linux on POWER:发行版迁移和二进制兼容性考虑事项
    映射网络驱动器VBS脚本
    [笔记] 使用 opcache 优化生产环境PHP
    2020最新版MySQL数据库面试题(三)
    请注意,面试中有这7个行为肯定会被拒绝!
  • 原文地址:https://www.cnblogs.com/wszhu/p/12598755.html
Copyright © 2011-2022 走看看