-1

代码:
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。但我能做些什么来解决这个问题?我认为我的概念是正确的,而不是应用程序。我之前问过这个问题,并被告知我需要制作两个阵列(一个用于墙壁,另一个用于访问)但我该如何应用它呢?

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 阵列,您旅行并使其成为真的(边界已经是真的)[2,2]->[2,3]->[3,3]->[3,2]->[3, 1]->[2,1]->[1,1]->[1,2]->[1,3]

在此处输入图像描述

你从中间开始,在你发现已经为真(边界或已访问)之前开始访问并轮流,它涵盖了所有节点

于 2013-03-15T04:27:12.007 回答
0

解决方案仍然与您上次发布此问题时相同 - 您需要有两个数组

-对于迷宫中的每个地方都是正确的,这是一个墙壁 - 迷宫的瓷砖

- 一开始都是假的 - 求解器的瓷砖

只有当两个数组都为假时,求解器才能移动到一个图块上,并将第二个数组(求解器的图块)设置为真,同时不理会第一个数组(迷宫的图块)。

于 2013-03-15T04:03:22.407 回答
0

据说,这不是一个“编码”错误。你根本不知道你想要什么行为。尝试注释掉生成迷宫的行。以 6 作为参数运行您的程序。你得到:

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

这是什么迷宫?出口在哪里?同样,这不是编码问题,这是设计缺陷。当然,如果您从这个迷宫的范围内开始,您将参观所有的广场!

于 2013-03-15T04:04:15.490 回答