-1

code:
Array は私が作成した定義済みのブール配列で、val は配列の長さ (正方形です) です。ランダムな値を使用するのではなく、開始点として使用します

     import java.util.*;
     import javax.swing.*;
     public class Main

{

public void main()
{

String Val = JOptionPane.showInputDialog("Enter the number of rows/columns");
int x = Integer.parseInt(Val);

boolean mazeArch[][] = new boolean [x][x]; 
BoundariesDeclared(mazeArch, x);

generateMaze(mazeArch, x);
convertArray(mazeArch, x);

}

 public void printArray(String Array[][]) // Prints out the array

{

      for (int i =0; i < Array.length; i++) {
          for (int j = 0; j < Array.length; j++) {
        System.out.print(" " + Array[i][j]);
    }
    System.out.println(""); 
}

}

   public void convertArray(boolean Array[][], int z) 

{

  String RealArray[][] = new String [z][z];
for(int x = 0; x < Array.length; x++)
{
    for(int y = 0; y < Array.length; y++)
    {
        if(Array[x][y] == true)
        {
            RealArray[x][y] = "*";
        }
        if(Array[x][y] == false)
        {
            RealArray[x][y] = " ";
        }
    }
}
printArray(RealArray);

}

 public void BoundariesDeclared(boolean Array[][], int y) 

{

for(int x = 0; x < Array.length; x++)
    Array[0][x] = true;
for (int x = 0; x < Array.length; x++)
    Array[x][0] = true;    
for (int x = 0; x < Array.length; x++)
    Array[x][Array.length-1] = true;   
for (int x = 0; x < Array.length; x++)
    Array[Array.length-1][x] = true;

}

 public void generateMaze(boolean Array[][], int val) 

{

Stack<Integer> StackX = new Stack<Integer>();
Stack<Integer> StackY = new Stack<Integer>();
int x = val / 2; // Start in the middle
int y = val / 2; // Start in the middle
StackX.push(x);
StackY.push(y);

while(!StackX.isEmpty())
{
    Array[x][y] = true; // is Visited
    x = StackX.peek();
    y = StackY.peek();

    if(Array[x][y+1] == false)
    {
        StackX.push(x);
        StackY.push(y+1);
        y = y + 1;
    }
    else if(Array[x][y-1] == false)
    {
        StackX.push(x);
        StackY.push(y-1);
        y = y - 1;
    } 
    else if(Array[x+1][y] == false)
    {
        StackX.push(x+1);
        StackY.push(y);
        x = x+1;
    } 
    else if(Array[x-1][y] == false)
    {
        StackX.push(x-1);
        StackY.push(y);
        x = x-1;
    } 
    else
    {
        StackX.pop();
        StackY.pop();
    }
}

} }

結果を印刷するたびに、星だけが表示されます。これは、すべてのブール値が true に設定されていることを意味します。私はすべてのスポットを訪れているので、それらがすべて true に設定されているという結果になるため、エラーを理解しています。しかし、これを修正するにはどうすればよいですか? アプリケーションではなく、コンセプトが正しいと思います。以前に質問したところ、2 つのアレイ (1 つは壁用、もう 1 つは訪問用) を作成する必要があると言われましたが、これもどのように適用すればよいでしょうか?

4

4 に答える 4

1

あなたは何をしようとしているのかについて言及していませんでした。そのため、私たちができることはあまりありません。

  • この迷路は何をしているのですか?
  • あなたの意見は何ですか?
  • 期待される結果は?

この行を追加して、自分でデバッグしてください。

public void generateMaze(boolean Array[][], int val) {
        Stack<Integer> StackX = new Stack<Integer>();
        Stack<Integer> StackY = new Stack<Integer>();
        int x = val / 2; // Start in the middle
        int y = val / 2; // Start in the middle
        StackX.push(x);
        StackY.push(y);

        while (!StackX.isEmpty()) {
            Array[x][y] = true; // is Visited
            x = StackX.peek();
            y = StackY.peek();

            if (Array[x][y + 1] == false) {
                StackX.push(x);
                StackY.push(y + 1);
                y = y + 1;
            } else if (Array[x][y - 1] == false) {
                StackX.push(x);
                StackY.push(y - 1);
                y = y - 1;
            } else if (Array[x + 1][y] == false) {
                StackX.push(x + 1);
                StackY.push(y);
                x = x + 1;
            } else if (Array[x - 1][y] == false) {
                StackX.push(x - 1);
                StackY.push(y);
                x = x - 1;
            } else {
                StackX.pop();
                StackY.pop();
            }
            convertArray(Array, val); // add this line
        }
    }
于 2013-03-15T03:57:53.330 に答える
0

出力に正確に何を期待しているのかはわかりませんが、問題がどこにあるかはわかります。あなたのgenerateMaze()方法では、最終的にすべてのノードに触れることになるスパイラルモードのように移動しています。5x5 の配列があるとします。移動して true にします (境界は既に true です) [2,2]->[2,3]->[3,3]->[3,2]->[3, 1]->[2,1]->[1,1]->[1,2]->[1,3]

ここに画像の説明を入力

途中から開始し、訪問を開始して、すでに true (境界または訪問済み) を見つける直前に交代し、すべてのノードをカバーします。

于 2013-03-15T04:27:12.007 に答える
0

解決策は、この質問を最後に投稿したときと同じです-2つの配列が必要です

- 壁である迷路のすべての場所に当てはまるもの - 迷路のタイル

- すべて false で始まるもの - ソルバーのタイル

ソルバーは、その時点で両方の配列が false である場合にのみタイルに移動でき、最初の配列 (迷路のタイル) をそのままにして、2 番目の配列 (ソルバーのタイル) を true に設定します。

于 2013-03-15T04:03:22.407 に答える
0

言うなれば、これは「コーディング」のバグではありません。あなたは単にあなたが望む行動を知らないだけです。迷路を生成する行をコメントアウトしてみてください。パラメータとして 6 を指定してプログラムを実行します。あなたは得る:

 * * * * * *
 *         *
 *         *
 *         *
 *         *
 * * * * * *

これは何の迷路ですか?出口はどこですか?繰り返しますが、これはコーディングの問題ではなく、設計上の欠陥です。もちろん、この迷路の境界内から始めれば、すべてのマスを訪れることができます!

于 2013-03-15T04:04:15.490 に答える