【问题标题】:Solving Maze c#解决迷宫 c#
【发布时间】:2019-02-01 16:56:14
【问题描述】:

我想在运行程序时自动解迷宫。

我的迷宫一开始是这样的。

1 0 0 0
0 0 1 0
0 1 1 0
0 1 1 0

最后应该是这样的:

0 1 1 1
1 1 0 1
1 0 0 1
1 0 0 1

我有一个 3 维数组(行、列和边)。

边可以是下(0)、右(1)、上(2)和左(3)。因此,如果我有墙,我会检查每个单元格。如果是,我在那个单元格中输入是。

mazeTab[0, 0, 0] = 0;
mazeTab[0, 0, 1] = 1;
mazeTab[0, 0, 2] = 1;
mazeTab[0, 0, 3] = 1;

mazeTab[1, 0, 0] = 0;
mazeTab[1, 0, 1] = 0;
mazeTab[1, 0, 2] = 1;
mazeTab[1, 0, 3] = 1;

mazeTab[2, 0, 0] = 0;
mazeTab[2, 0, 1] = 0;
mazeTab[2, 0, 2] = 1;
mazeTab[2, 0, 3] = 0;

mazeTab[3, 0, 0] = 0;
mazeTab[3, 0, 1] = 1;
mazeTab[3, 0, 2] = 1;
mazeTab[3, 0, 3] = 0;
//=================================

mazeTab[0, 1, 0] = 0;
mazeTab[0, 1, 1] = 0;
mazeTab[0, 1, 2] = 1;
mazeTab[0, 1, 3] = 1;

mazeTab[1, 1, 0] = 1;
mazeTab[1, 1, 1] = 1;
mazeTab[1, 1, 2] = 0;
mazeTab[1, 1, 3] = 0;

mazeTab[2, 1, 0] = 1;
mazeTab[2, 1, 1] = 1;
mazeTab[2, 1, 2] = 1;
mazeTab[2, 1, 3] = 1;

mazeTab[3, 1, 0] = 0;
mazeTab[3, 1, 1] = 1;
mazeTab[3, 1, 2] = 0;
mazeTab[3, 1, 3] = 1;
//===================================
mazeTab[0, 2, 0] = 0;
mazeTab[0, 2, 1] = 1;
mazeTab[0, 2, 2] = 0;
mazeTab[0, 2, 3] = 1;

mazeTab[1, 2, 0] = 1;
mazeTab[1, 2, 1] = 1;
mazeTab[1, 2, 2] = 1;
mazeTab[1, 2, 3] = 1;

mazeTab[2, 2, 0] = 1;
mazeTab[2, 2, 1] = 1;
mazeTab[2, 2, 2] = 1;
mazeTab[2, 2, 3] = 1;

mazeTab[3, 2, 0] = 0;
mazeTab[3, 2, 1] = 1;
mazeTab[3, 2, 2] = 0;
mazeTab[3, 2, 3] = 1;
//===================================
mazeTab[0, 3, 0] = 1;
mazeTab[0, 3, 1] = 1;
mazeTab[0, 3, 2] = 0;
mazeTab[0, 3, 3] = 1;

mazeTab[1, 3, 0] = 1;
mazeTab[1, 3, 1] = 1;
mazeTab[1, 3, 2] = 1;
mazeTab[1, 3, 3] = 1;

mazeTab[2, 3, 0] = 1;
mazeTab[2, 3, 1] = 1;
mazeTab[2, 3, 2] = 1;
mazeTab[2, 3, 3] = 1;

mazeTab[3, 3, 0] = 0;
mazeTab[3, 3, 1] = 1;
mazeTab[3, 3, 2] = 0;
mazeTab[3, 3, 3] = 1;

然后我用一种方法解决了整个迷宫,但我很确定有什么地方不对劲。使用的时候,我检查下一个单元格,例如:如果我有一个0,我可以去上面,我检查上面的单元格是否也可以去下面的单元格,以验证我们没有墙在那里。

   int solvemaze(int horizontal, int vertical,int cote)
    {

        //horizontalestination is the last cell(maze[taille-1][taille-1])
        if ((horizontal == taille - 1) && (vertical == taille - 1))
        {
            solution[horizontal,vertical] = 1;
            return 1;
        }

        if (horizontal >= 0 && vertical >= 0 && horizontal < taille && vertical < taille && solution[horizontal,vertical] == 0)
        {

            printsolution();
            //if safe to visit then visit the cell
            solution[horizontal,vertical] = 1;
            //under
            if (mazeTab[horizontal,vertical,cote]==0)
                return solvemaze(horizontal,vertical+1,(cote+1)%4);
            cote = (cote + 1) % 4;
            //right
            if (mazeTab[horizontal, vertical, 1] == 0)
                return solvemaze(horizontal+1, vertical, (cote + 1)% 4);
            cote = (cote + 1) % 4;
            //up
            if (mazeTab[horizontal, vertical, 2] == 0)
                return solvemaze(horizontal, vertical -1, (cote + 1) % 4);
            cote = (cote + 1) % 4;
            //left
            if (mazeTab[horizontal, vertical, 3] == 0)
                return solvemaze(horizontal -1, vertical, (cote + 1) % 4);
            cote = (cote + 1) % 4;
            //backtracking
            solution[horizontal,vertical] = 0;
            return 1;
        }
        return 1;

只是提醒你,如果你可以去一个特定的单元格,那么它是1。所以解决迷宫的路径是1。

最后,我从 0,3,0 单元格开始迷宫,也就是这个:

1 0 0 0
0 0 1 0
0 1 1 0
**0** 1 1 0

当我跑步时,我会得到以下结果:

0 1 1 1 
1 1 0 0 
1 0 0 0 
0 0 0 0

后面的 0 应该已经上交了 1..

0 1 1 1 
1 1 0 **0** 
1 0 0 **0** 
**0** 0 0 **0**

你们能帮我找出错误吗?

【问题讨论】:

  • 1.您能否更新问题以包含更多迷宫输入和预期输出? 2. 一个好的起点是将数组分解为二维数组。例如,侧面尺寸可以替换为bitflag enum。
  • 您好,我已经更新了我的问题,对于数组,我必须在 3 维中进行项目的校规..
  • 在if 块中,您应该检查solvemaze(...) 的返回值,只有当它是1 时才返回结果。回溯后,你应该return 0而不是1。

标签: c# maze


【解决方案1】:

感谢@HHLV,我想出了如何解决这个问题。

所以我的方法solvemaze看起来像这样:

int solvemaze(int horizontal, int vertical, int cote)
    {


        if ((horizontal == taille - 1) && (vertical == taille - 1))
        {
            solution[vertical, horizontal] = 1;
            return 1;
        }

        if (horizontal >= 0 && vertical >= 0 && horizontal < taille && vertical < taille && solution[vertical, horizontal] == 0)
        {

            printsolution();
            //if safe to visit then visit the cell
            solution[vertical, horizontal] = 1;

            for (int i = 0; i < 3; i++)
            {

                if (mazeTab[horizontal, vertical, cote] == 0)
                {
                    if (cote == 0 && solvemaze(horizontal, vertical + 1, (cote + 3) % 4) == 1)
                    {
                        return 1;
                    }
                    else if (cote == 1 && solvemaze(horizontal + 1, vertical, (cote + 3) % 4) == 1)
                    {
                        return 1;

                    }
                    else if (cote == 2 && solvemaze(horizontal, vertical - 1, (cote + 3) % 4) == 1)
                    {
                        return 1;

                    }
                    else if (cote == 3 && solvemaze(horizontal - 1, vertical, (cote + 3) % 4) == 1)
                    {
                        return 1;

                    }
                }
                cote = (cote + 1) % 4;

            }

            //backtracking
            solution[vertical, horizontal] = 0;

            return 0;
        }
        return 0;

    }

知道它有效,谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 2015-08-31
    • 2014-12-11
    相关资源
    最近更新 更多