Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我试图用下面的代码解决这个迷宫。但答案不是';对于所有输入,如n=4,t精确 迷宫问题_C_Arrays_Dynamic Programming_Maze - Fatal编程技术网

C 我试图用下面的代码解决这个迷宫。但答案不是';对于所有输入,如n=4,t精确 迷宫问题

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。你可以选择 向右或向下

提供了一个大小为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。你可以选择 向右或向下移动,即从位置(x,y)开始,可以转到位置(x,y+1)或(x+1,y)

输入

第一行由输入数组N的大小组成(=0&&x=0&&y对于(int i=0;i将
N
更改为变量,您的代码几乎是正确的。您只是忽略了一个硬编码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,复杂度是指数级的。我们如何才能做得更好

    迷宫的第一列和第一排怎么样?什么时候可以到达

    第一行/列中的单元格只能以一种方式到达(想象第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