C 我试图用下面的代码解决这个迷宫。但答案不是';对于所有输入,如n=4,t精确 迷宫问题
提供了一个大小为N*N的矩阵,源位置为(0,0)和 二维阵列中(N-1,N-1)处的目标。数组中的某些位置标记为0,这些位置是阻塞的单元格,其余位置标记为1 路径是从(0,0)到(N-1,N-1)的连接元素序列,由1组成。如果序列中的每个1与序列中的下一个1相邻(上一个或左一个),则连接2D阵列中的1序列 例如,在以下矩阵中C 我试图用下面的代码解决这个迷宫。但答案不是';对于所有输入,如n=4,t精确 迷宫问题,c,arrays,dynamic-programming,maze,C,Arrays,Dynamic Programming,Maze,提供了一个大小为N*N的矩阵,源位置为(0,0)和 二维阵列中(N-1,N-1)处的目标。数组中的某些位置标记为0,这些位置是阻塞的单元格,其余位置标记为1 路径是从(0,0)到(N-1,N-1)的连接元素序列,由1组成。如果序列中的每个1与序列中的下一个1相邻(上一个或左一个),则连接2D阵列中的1序列 例如,在以下矩阵中 1 1 0 0 1 1 1 0 1 蓝色标记的1s是从(0,0)到(2,2)的连接路径 请注意,(0,0)和(N-1,N-1)处的单元格始终为1。你可以选择 向右或向下
1 1 0
0 1 1
1 0 1
蓝色标记的1s是从(0,0)到(2,2)的连接路径
请注意,(0,0)和(N-1,N-1)处的单元格始终为1。你可以选择
向右或向下移动,即从位置(x,y)开始,可以转到位置(x,y+1)或(x+1,y)
输入
第一行由输入数组N的大小组成(=0&&xN
更改为变量,您的代码几乎是正确的。您只是忽略了一个硬编码52而不是N的地方:
int-maze[52][52];
应该是int-maze[N][N];
编译器应该提醒您的另一件事是:
int sol[N][N] = { // etc.
不允许:可变长度数组可能没有初始值设定项。您需要通过循环或memset(需要#include
)进行初始化:
在做了这些更改之后,您的代码在一些简单的迷宫中为我工作
还有一个不同的问题;您的迷宫求解算法无法处理必须先下后上(或先右后左)的迷宫。因此,它适用于任何4x4迷宫,但在该迷宫中失败:
5
1 0 1 1 1
1 0 1 0 1
1 0 1 0 1
1 1 1 0 1
0 0 0 0 1
但是,您的问题描述似乎定义了路径只能向右或向下移动。因此,根据该条件,您的代码将能够解决所有需要的迷宫。也许作为额外的练习,您可以更新代码,以便能够解决我刚才发布的迷宫:)这是一个非常有趣的问题,动态编程非常方便。事实上,每当有人问我什么是动态编程时,我都会使用这个例子 下面是值得考虑的问题: 如果单元格为0,是否仍有可能到达此单元格 如果一个单元格为1,您如何知道您可以到达该单元格?您可以使用哪些不同的方式到达该单元格 第一个问题很明显。如果单元格为0,则无法访问该单元格 第二个问题不是那么简单,但仍然很简单:一个单元格可以通过两种方式到达:从它上面的单元格或它左边的单元格 现在我们已经进行了这些观察,我们知道给定最后一个单元(N-1,N-1),我们知道如果:
现在,这不是很有效。在最坏的情况下,所有单元格都是1,复杂度是指数级的。我们如何才能做得更好 迷宫的第一列和第一排怎么样?什么时候可以到达 第一行/列中的单元格只能以一种方式到达(想象第1行和第1列中填充了0),我们知道单元格(0,0)是1,我们可以迭代地找出第一行/列中所有单元格的可达性。使用第一行/列,您可以对第二行/列执行相同的操作 换句话说,一行的状态取决于它上面的行;一列的状态取决于它左边的列。根据定义,我们已经有了row/col-1,其余的可以按O(n^2)逐行迭代计算
我故意不提供代码,因为思考过程在这里可能更有价值。希望这有帮助!您自己做了什么来调试问题?只是快速浏览一下……但是在
4
案例中,您只填写maze
的前4x4个条目,但是您的迷宫解算器解决了问题
int sol[N][N] = { // etc.
int sol[N][N];
memset(&sol, 0, sizeof sol);
5
1 0 1 1 1
1 0 1 0 1
1 0 1 0 1
1 1 1 0 1
0 0 0 0 1