標準入力された迷路の最短経路を出力するアルゴリズムを書いたのですが、なぜか63行目でjava.lang.ArrayIndexOutOfBoundsExceptionが発生してしまいます。
配列dの宣言はきちんとしているはずなのですが、、、、原因がわかりません。
エラーメッセージ Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at study.piece.bfs(maze.java:63) at study.piece.solve(maze.java:101) at study.maze.main(maze.java:23)
ソースコード package study; import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.Queue; import java.util.Scanner; public class maze { public static void main(String[] args) { Scanner sc = new Scanner(System.in,StandardCharsets.UTF_8); int N = sc.nextInt(); int M = sc.nextInt(); int sx,sy; //スタートの座標 int gx,gy; //ゴールの座標 String[][] field = new String[N][M]; for(int i = 0; i<N; i++) { String line = sc.next(); for(int j = 0; j<M; j++) { field[i][j] = String.valueOf(line.charAt(i)); } } piece pie = new piece(N, M,field); pie.solve(); } } class piece{ final int INF = 1000000000; int N,M; int sx,sy; //スタートの座標 int gx,gy; //ゴールの座標 String[][] field; piece(int N,int M,String[][] field){ this.N= N; this.M = M; this.field = field; for(int i = 0; i<N; i++) { for(int j = 0; j<M; j++) { if(field[i][j].equals("S")) { sx = i; sy = j; }else if(field[i][j].equals("G")) { gx = i; gy = j; } } } } int[][] d = new int[N][M]; //各点までの最短距離の配列 int[] dx = {1,0,-1,0}; int[] dy = {0,1,0,-1}; //(sx,sy)から(gx,gy)への最短距離を求める //たどり着けないとINF int bfs() { Queue<pair> que = new ArrayDeque<>(); //すべての点をINFで初期化 for(int i = 0; i<N; i++) { for(int j = 0; j<M; j++) { d[i][j] = INF; //63行目 } } //スタート地点をキューに入れ、その点の距離を0に que.add(new pair(sx,sy)); d[sx][sy] = 0; while(que.size() == 0) { //キューの先頭を取り出す pair p = que.element(); que.poll(); //取り出した状態がゴールならやめる if(p.x == gx && p.y == gy) { break; } //移動4方向をループ for(int i = 0; i<4; i++) { //移動したあとの天を(nx,ny)とする int nx = p.x + dx[i], ny = p.y + dy[i]; //移動が可能かの判定とすでに訪れたことがあるかの判定(d[nx][ny] != INFなら訪れたことがある) if(0<=nx && nx<N && 0<=ny && ny<M && field[nx][ny] != "#" && d[nx][ny] == INF) { que.add(new pair(nx,ny)); d[nx][ny] = d[p.x][p.y]+1; } } } return d[gx][gy]; } void solve() { int res = bfs(); System.out.println(res); } } class pair{ int x,y; pair(int x,int y){ this.x = x; this.y = y; } public int compareTo(Object ob){ return this.y - ((pair)ob).y; } }
標準入力されるN×Mの迷路の例 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G#
回答2件
あなたの回答
tips
プレビュー