创建DFS迷宫时遇到问题 import java.util.*; 公共级发电机 { 公共void init() { 字符串迷宫[][]=新字符串[20][20]; 对于(int i=0;i

创建DFS迷宫时遇到问题 import java.util.*; 公共级发电机 { 公共void init() { 字符串迷宫[][]=新字符串[20][20]; 对于(int i=0;i,java,depth-first-search,Java,Depth First Search,Ok)。这并不能完全修复程序,但可以修复代码中的一个问题: 您对if(EAST==“#”)或类似命令进行了大量测试。但是,您不能对字符串使用==,因为这会比较它们的引用。您必须使用.equals()。因此,您应该改用:if(EAST.equals(“#”) 我也看不到你在哪里更改迷宫[][]数组的内容。看起来你只是在编辑一个堆栈,但忽略了最后打印的数组 样式调整: 如果有布尔变量(我们称之为var),则不必使用If(var==true),而是使用If(var) 不要使用if/else语句分配布尔

Ok)。这并不能完全修复程序,但可以修复代码中的一个问题:

您对
if(EAST==“#”)或类似命令进行了大量测试。但是,您不能对字符串使用
==
,因为这会比较它们的引用。您必须使用
.equals()
。因此,您应该改用:
if(EAST.equals(“#”)

我也看不到你在哪里更改迷宫[][]数组的内容。看起来你只是在编辑一个堆栈,但忽略了最后打印的数组

样式调整:

  • 如果有布尔变量(我们称之为
    var
    ),则不必使用
    If(var==true)
    ,而是使用
    If(var)

  • 不要使用if/else语句分配布尔变量。例如:

    import java.util.*;
    
    public class MazeGenerator
    {
    public void init()
    {
        String Maze[][] = new String [20][20];
    
        for (int i =0; i <20; i++) {
            for (int j = 0; j < 20; j++) {
                Maze[i][j] = "#";
            }
        }
    
        generate(Maze);
    
        for (int i =0; i <20; i++) {
            for (int j = 0; j < 20; j++) {
                System.out.print(" " + Maze[i][j]);
            }
            System.out.println("");
        }
    }
    
    public void generate (String Maze[][])
    {
        Stack <String> CellStack = new Stack<String>();
        int TotalCells = Maze.length * Maze.length;
        int x = 10, y = 10;
    
        String CurrentCell = Maze[x][y];
        Maze[x][y] = "-";
        CellStack.push(CurrentCell);
        int VisitedCell = 1;
    
        boolean EastT, WestT, NorthT, SouthT;
    
        while(VisitedCell < TotalCells)
        {
            String EAST = Maze[x+1][y];
            String WEST = Maze[x-1][y];
            String NORTH = Maze[x][y+1];
            String SOUTH = Maze[x][y-1];
    
            if(EAST == "#")
                EastT = true;
            else
                EastT = false;
    
            if(WEST == "#")
                WestT = true;
            else
                WestT = false;
    
            if(NORTH == "#")
                NorthT = true;
            else
                NorthT = false;
    
            if(SOUTH == "#")
                SouthT = true;
            else
                SouthT = false;    
    
            if(WestT == true || EastT == true || NorthT == true || SouthT == true)
            {
                double Random = (int) (Math.random() * 4) + 1;
    
                switch ((int) Random)
                {   
                    case 1: 
                    if(EastT == true){   
                        CurrentCell = EAST;
                        break;
                    }
                    else 
                        break;
    
                    case 2:
                    if(WestT == true){   
                        CurrentCell = WEST;
                        break;
                    }
                    else
                        break;
    
                    case 3:
                    if(NorthT == true){   
                        CurrentCell = NORTH;
                        break;
                    }
                    else
                        break;
    
                    case 4:
                    if(SouthT == true){   
                        CurrentCell = SOUTH;
                        break;
                    }
                    else
                        break;
                }
                CurrentCell = "-";
                CellStack.push(CurrentCell);
                VisitedCell++;
            }
            else
            {
                CurrentCell = CellStack.pop();
            }
        }
    }
    }
    
    可以简化为:
    WEST=WEST.equals(“#”);


  • 好的。这并不能完全修复您的程序,但它修复了代码中的一个问题:

    您对
    if(EAST==“#”)或类似命令进行了大量测试。但是,您不能对字符串使用
    ==
    ,因为这会比较它们的引用。您必须使用
    .equals()
    。因此,您应该改用:
    if(EAST.equals(“#”)

    我也看不到你在哪里更改迷宫[][]数组的内容。看起来你只是在编辑一个堆栈,但忽略了最后打印的数组

    样式调整:

  • 如果有布尔变量(我们称之为
    var
    ),则不必使用
    If(var==true)
    ,而是使用
    If(var)

  • 不要使用if/else语句分配布尔变量。例如:

    import java.util.*;
    
    public class MazeGenerator
    {
    public void init()
    {
        String Maze[][] = new String [20][20];
    
        for (int i =0; i <20; i++) {
            for (int j = 0; j < 20; j++) {
                Maze[i][j] = "#";
            }
        }
    
        generate(Maze);
    
        for (int i =0; i <20; i++) {
            for (int j = 0; j < 20; j++) {
                System.out.print(" " + Maze[i][j]);
            }
            System.out.println("");
        }
    }
    
    public void generate (String Maze[][])
    {
        Stack <String> CellStack = new Stack<String>();
        int TotalCells = Maze.length * Maze.length;
        int x = 10, y = 10;
    
        String CurrentCell = Maze[x][y];
        Maze[x][y] = "-";
        CellStack.push(CurrentCell);
        int VisitedCell = 1;
    
        boolean EastT, WestT, NorthT, SouthT;
    
        while(VisitedCell < TotalCells)
        {
            String EAST = Maze[x+1][y];
            String WEST = Maze[x-1][y];
            String NORTH = Maze[x][y+1];
            String SOUTH = Maze[x][y-1];
    
            if(EAST == "#")
                EastT = true;
            else
                EastT = false;
    
            if(WEST == "#")
                WestT = true;
            else
                WestT = false;
    
            if(NORTH == "#")
                NorthT = true;
            else
                NorthT = false;
    
            if(SOUTH == "#")
                SouthT = true;
            else
                SouthT = false;    
    
            if(WestT == true || EastT == true || NorthT == true || SouthT == true)
            {
                double Random = (int) (Math.random() * 4) + 1;
    
                switch ((int) Random)
                {   
                    case 1: 
                    if(EastT == true){   
                        CurrentCell = EAST;
                        break;
                    }
                    else 
                        break;
    
                    case 2:
                    if(WestT == true){   
                        CurrentCell = WEST;
                        break;
                    }
                    else
                        break;
    
                    case 3:
                    if(NorthT == true){   
                        CurrentCell = NORTH;
                        break;
                    }
                    else
                        break;
    
                    case 4:
                    if(SouthT == true){   
                        CurrentCell = SOUTH;
                        break;
                    }
                    else
                        break;
                }
                CurrentCell = "-";
                CellStack.push(CurrentCell);
                VisitedCell++;
            }
            else
            {
                CurrentCell = CellStack.pop();
            }
        }
    }
    }
    
    可以简化为:
    WEST=WEST.equals(“#”);


  • 您的实现存在几个问题。您可以看到最大的问题是CurrentCell变量。它只是一个字符串变量,您正在更改变量的值,但除了(10,10)处的单元格外,从未触及迷宫单元格的实际值


    建议:创建一个Cell对象来表示迷宫的一个单元,其属性为x、y坐标,字符“#”或“-”作为迷宫单元值,布尔值为“已访问”指示是否已访问。更新当前单元格的x、y坐标。每次移动后设置当前单元格值。

    您的实现存在几个问题。您可以看到最大的问题是CurrentCell变量。它只是一个字符串变量,您正在更改变量的值但除了(10,10)处的细胞外,从未接触过迷宫细胞的真实值


    建议:创建一个单元格对象来表示迷宫的一个单元格,其属性为x、y坐标,字符“#”或“-”作为迷宫单元格值,布尔值为“已访问”以指示是否已访问。更新当前单元格的x、y坐标。每次移动后设置当前单元格值。

    更改
    字符串迷宫[][]=新字符串[20] [20]
    进入
    字符迷宫[]][]=新字符[20][20]
    :然后您可以使用
    …='.'.'.'
    而不是
    …等于(“#”)
    注意命名约定……命名变量时,第一个单词不大写,后面的单词也不大写。此外,除非明确声明变量名的每个字母都是
    最终的
    (参考您的
    西
    变量),否则不要将其大写。将
    String Maze[]][]=new String[20][20]
    更改为
    char Maze[]][]=new char[20][20]
    :然后您可以使用
    …=='.'.'
    而不是
    …equals(“#”)
    注意命名约定……命名变量时,第一个单词不大写,后面的单词不大写。此外,除非明确声明变量名的每个字母都是
    final
    (参考您的
    NORTH
    SOUTH
    EAST
    WEST
    变量),否则不要将其大写。