1

2D配列の[0][0]の位置にある文字列値で、迷路の始まりをマークする必要があります。問題は、新しい行を読み取るたびに、位置[i] [0]の値が変更される可能性があり、常に位置[0][0]の最初の値である必要があることです。スペースや区切り文字がないので、各行の各行の各文字値を読み取っています。

maze [0] [0]の文字列が1に設定したい文字列であることがわかるだけで、どうやって取得するのかわかりません。

迷路は、最初の行が2つの整数を持つように配置されています。1番目のint=迷路の行数、2番目のint=迷路の列数。開始は常に[0][0]で、終了は常に[row-1][col-1]です。残りの行は迷路です。したがって、テキストファイルの2行目=迷路の0行目です。

そこで、ファイルを文字列値として読み取り、1行目の文字列値をintに解析し、それらの値を使用して整数の2D配列を定義しました。

次に、残りの行を読み、パスを構成する値(存在する場合)と常に等しい最初のchar値と比較しました。読み取られたシンボルがパスに対して=の場合、1として格納され、それ以外の場合は0として格納されます。次に、2D配列を調べ、さまざまな座標の比較を開始してパスを決定し、その情報をに格納します。キュー、次にスタック。

私が抱えている問題は、最初の3行では機能しますが、残りの行では値1と0が反転することです。コードのスニピット、それが読み取っている.txtファイルを添付しました。これは、各行の最初の要素と比較しているためであり、最初の3行は「。」であることがわかります。次に、残りの行に「+」を付けます。

import java.io.*;
import java.util.*;

public class MazeArray {
    String info;
    String[] rowCol;
    //private char [][] maze;
    private int [][] maze; 
    private Scanner readFile;
    private int path, cur, row, col; 

public MazeArray()


{
    maze = new int[0][0];
}

public int[][] readFile(String fileName) throws IOException
{
    readFile = new Scanner(new File(fileName)); 

    info = readFile.nextLine();
    rowCol = info.split(" ",2);
    row = Integer.parseInt(rowCol[0]);
    col = Integer.parseInt(rowCol[1]);
    maze = new int[row][col];
    System.out.println("# of rows: " + row + " # of col: " + col);

    while (readFile.hasNextLine())
    {
        //System.out.println(readFile.next()); 

        for (int i=0; i<row; i++)
        {
            String symbol = readFile.nextLine();

            for (int j=0; j<col; j++)
            {
                path = symbol.charAt(0);
                //safe = symbol.charAt(maze[0][0]);
                maze[i][j] = symbol.charAt(j);
                if (maze[i][j] == path)
                {
                    maze[i][j] = 1;
                }
                else
                {
                    maze[i][j] = 0;
                }
                System.out.println("for loop Path coord = (" + i + " , " + j + ") Value at coord = " + maze[i][j]);

            }//for j      
        }//for i
    }// while
    readFile.close();
    return maze;
}

txt.File(迷路)の内容

7 12
..+.+.++++++
.++...++...+
..++.....+.+
+.+..++.+..+
+...++....++
+.+++..++..+
++++++++++..

出力-右

for loop Path coord = (0 , 0) Value at coord = 1
for loop Path coord = (0 , 1) Value at coord = 1
for loop Path coord = (0 , 2) Value at coord = 0
for loop Path coord = (0 , 3) Value at coord = 1
for loop Path coord = (0 , 4) Value at coord = 0
for loop Path coord = (0 , 5) Value at coord = 1
for loop Path coord = (0 , 6) Value at coord = 0
for loop Path coord = (0 , 7) Value at coord = 0
for loop Path coord = (0 , 8) Value at coord = 0
for loop Path coord = (0 , 9) Value at coord = 0
for loop Path coord = (0 , 10) Value at coord = 0
for loop Path coord = (0 , 11) Value at coord = 0
for loop Path coord = (1 , 0) Value at coord = 1
for loop Path coord = (1 , 1) Value at coord = 0
for loop Path coord = (1 , 2) Value at coord = 0
for loop Path coord = (1 , 3) Value at coord = 1
for loop Path coord = (1 , 4) Value at coord = 1
for loop Path coord = (1 , 5) Value at coord = 1
for loop Path coord = (1 , 6) Value at coord = 0
for loop Path coord = (1 , 7) Value at coord = 0
for loop Path coord = (1 , 8) Value at coord = 1
for loop Path coord = (1 , 9) Value at coord = 1
for loop Path coord = (1 , 10) Value at coord = 1
for loop Path coord = (1 , 11) Value at coord = 0
for loop Path coord = (2 , 0) Value at coord = 1
for loop Path coord = (2 , 1) Value at coord = 1
for loop Path coord = (2 , 2) Value at coord = 0
for loop Path coord = (2 , 3) Value at coord = 0
for loop Path coord = (2 , 4) Value at coord = 1
for loop Path coord = (2 , 5) Value at coord = 1
for loop Path coord = (2 , 6) Value at coord = 1
for loop Path coord = (2 , 7) Value at coord = 1
for loop Path coord = (2 , 8) Value at coord = 1
for loop Path coord = (2 , 9) Value at coord = 0
for loop Path coord = (2 , 10) Value at coord = 1
for loop Path coord = (2 , 11) Value at coord = 0

出力-間違っています

for loop Path coord = (3 , 0) Value at coord = 1 //Value should = 0 because ="+"
for loop Path coord = (3 , 1) Value at coord = 0
4

1 に答える 1

1

エラーは内側のforループ内にあります。

path = symbol.charAt(0); // <-- this is erroneous
maze[i][j] = symbol.charAt(j);
if (maze[i][j] == path) {
  maze[i][j] = 1;
} else {
  maze[i][j] = 0;
}

pathすべての行のフィールドを変更しています。.したがって、最初の3行については、これが行の最初の文字であるため、パスを設定しています。4行目では、最初の文字は +結果が反転して表示されるようになっています。

パス文字を決定する方法を決定し、ファイルごとに1回だけ実行する必要があります。迷路全体の最初の文字がパスシンボルであると確信している場合は、それを一度読んで保存します。

public int[][] readFile(String fileName) throws IOException {
  readFile = new Scanner(new File(fileName));

  info = readFile.nextLine();
  rowCol = info.split(" ", 2);
  row = Integer.parseInt(rowCol[0]);
  col = Integer.parseInt(rowCol[1]);
  maze = new int[row][col];
  System.out.println("# of rows: " + row + " # of col: " + col);

  int row = 0;

  while (readFile.hasNextLine()) {
    String symbol = readFile.nextLine();

    if (row == 0) {
      path = symbol.charAt(0);
    }

    for (int j = 0; j < col; j++) {
      maze[row][j] = symbol.charAt(j);
      if (maze[row][j] == path) {
        maze[row][j] = 1;
      } else {
        maze[row][j] = 0;
      }
      System.out.println("Path coord = (" + row + " , " + j
          + ") Value at coord = " + maze[row][j]);

    }// for j

    row++;

  }// while
  readFile.close();
  return maze;
}

ループ構造も修正しました。元の例では、whileループは効果がなく、ループは1回だけでした。あなたのforループはすべての仕事をしていました(読むべき行があることを確認せずに)。

その他の所見:

  • 現在、クラスは単一の静的メソッドを使用してユーティリティクラスに簡略化できます(ただし、これは将来変更される可能性があります)。

  • クラスのフィールドとして保存されている一時変数(、、rowなどcol)があります。readFile代わりに、メソッドの変数にする必要があります。

  • 1バイナリ値(および)を配列に格納しているように見えます0が、整数として格納されています。代わりにブール配列を返すことを検討できます。

于 2012-10-27T09:19:46.157 に答える