解决迷宫问题的C程序

时间:2019-08-24 20:18:25

标签: c recursion

我必须编写一个程序,该程序读取间隔[1,30]上的数字M和N,以及由MXN单元(M行和N列)组成的迷宫,并打印出从左上方的单元格到底部的路径右单元格。

示例输入:

4 3  
1101 0110 1110  
1110 1001 0010  
1000 0101 0011  
1001 0101 0111

用四个1或0描述细胞及其壁,其中1表示存在壁,0表示不存在壁,我们可以通过。第一个数字告诉我们是否存在左墙,第二个数字告诉我们上壁,第三个数字告诉我们右壁,第四个告诉底壁。

所以上面的地图看起来像这样:

+---+---+---+
|       |   |
+---+   +   +
|   |       |
+   +---+   +
|           |
+   +---+---+
|           |
+---+---+---+

路径描述为数字0(左),1(上),2(右)和3(下)之间的序列,中间没有空格,因此上述路径的解决方案是“ 232300322”。 >

到目前为止,我已经能够将迷宫放入2d char数组中,如下所示,但是我不确定如何从这里继续。我有个想法,就是使用一个叫做bool areWeThereYet()的递归函数,如果我们结束的话会返回true,但是我不确定这是否是正确的方法,因为我不确定如何正确实现它,所以它会打印出路径。

我还必须提到,所有测试用例中只有一条正确的路径。

我要求有人来指导我解决问题,我将非常感谢收到的所有帮助。

    int rows,columns;

    scanf("%d%d",&rows,&columns);
    char currentChar;
    char labyrinth[rows][columns * 4];

    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < columns * 4; j++){
            currentChar = getchar();
            if(currentChar == ' ' || currentChar == '\n'){
                currentChar = getchar();
            }
            labyrinth[i][j] = currentChar;
        }
    }

1 个答案:

答案 0 :(得分:0)

这是基本的2D搜索。虽然有精美的搜索算法,但您可以使用一种简单的算法。

您可以递归执行此操作,但是在较大的网格上,您的堆栈用完了,必须使用队列。

1)制作一个数组,用于存储到每个节点的距离;如果它使用与网格相同的访问权限,则最简单。初始化为INT_MAX或其他一些无限值。

2)制作另一个数组来存储反向路径;每个节点将在数组1中存储我们如何到达此处。

3)从起点开始;距离为0,前一个节点为self

4)对于每个可用的移动,如果当前路径长度小于网格中的路径长度,则将当前路径+ 1存储在距离数组中,并将此节点存储在反向路径数组中。在此位置致电或推送#4。

5)递归#4完全完成后,构造一个数组,其值的长度在distance数组的finish位置。您的路径仍在绝对坐标中。

6)从结束节点开始遍历位置数组中的路径,将值复制到在#5中创建的数组中。这导致从结束到开始的路径存储在此数组中。

7)反转此数组以获取从头到尾的路径。

8)在打印路径时,请使用带有简单解码器的循环,该解码器将绝对坐标转换为相对坐标。为此,我们需要从1开始而不是从0开始迭代。