Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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 Dijkstra路径重建_C_Algorithm_Dijkstra - Fatal编程技术网

C Dijkstra路径重建

C Dijkstra路径重建,c,algorithm,dijkstra,C,Algorithm,Dijkstra,好的,在过去的几周里,我一直在尝试创建一个类似流氓的游戏,我现在坚持的是将地下城的房间与走廊连接起来。请记住,这些都是用C编写的,我使用的是ncurses。到目前为止,我一直在尝试做的是,从A门到B门运行Dijkstra算法,记录以前的节点,然后回溯这组以前的节点,得到实际的路径。目前我的算法有一个问题,我调试它的步骤是将代码翻译成Java,但是算法工作得非常好。现在我告诉你,让我给你一个实际问题,这里是没有任何墙的10×10网格的最小路径的输出。这是以前访问过的节点的列表。 (y x)是原点

好的,在过去的几周里,我一直在尝试创建一个类似流氓的游戏,我现在坚持的是将地下城的房间与走廊连接起来。请记住,这些都是用C编写的,我使用的是ncurses。到目前为止,我一直在尝试做的是,从A门到B门运行Dijkstra算法,记录以前的节点,然后回溯这组以前的节点,得到实际的路径。目前我的算法有一个问题,我调试它的步骤是将代码翻译成Java,但是算法工作得非常好。现在我告诉你,让我给你一个实际问题,这里是没有任何墙的10×10网格的最小路径的输出。这是以前访问过的节点的列表。 (y x)是原点

(y x)  (1 1)  (0 1)  (1 3)  (0 3)  (1 5)  (0 5)  (1 7)  (0 7)  (1 9)
(0 0)  (2 1)  (0 2)  (2 3)  (0 4)  (2 5)  (0 6)  (2 7)  (0 8)  (2 9)
(1 0)  (3 1)  (1 2)  (3 3)  (1 4)  (3 5)  (1 6)  (3 7)  (1 8)  (3 9)
(2 0)  (4 1)  (2 2)  (4 3)  (2 4)  (4 5)  (2 6)  (4 7)  (2 8)  (4 9)
(3 0)  (5 1)  (3 2)  (5 3)  (3 4)  (5 5)  (3 6)  (5 7)  (3 8)  (5 9)
(4 0)  (6 1)  (4 2)  (6 3)  (4 4)  (6 5)  (4 6)  (6 7)  (4 8)  (6 9)
(5 0)  (7 1)  (5 2)  (7 3)  (5 4)  (7 5)  (5 6)  (7 7)  (5 8)  (7 9)
(6 0)  (8 1)  (6 2)  (8 3)  (6 4)  (8 5)  (6 6)  (8 7)  (6 8)  (8 9)
(7 0)  (9 1)  (7 2)  (9 3)  (7 4)  (9 5)  (7 6)  (9 7)  (7 8)  (9 9)
(8 0)  (10 1) (8 2)  (10 3) (8 4)  (10 5) (8 6)  (10 7) (8 8)  (10 9)
如您所见,在第0行第1列上,上一个节点应该是(0),而不是(1)。编辑(我正在添加我的新bfs,而不是dijkstra)

eq(q,startU);
/*而q中有元素*/
while(dq(q和u))
{
uX=u[1];
uY=u[0];
/*如果到了最后,就中断*/
如果(uX==xEnd&&uY==yEnd)
{
打破
}
见[uY][uX]=1;
/*当前单元格周围的邻居*/
对于(i=0;iprev[vY][vX][1]=uX;
p->prev[vY][vX][0]=uY;
u[0]=vY;
u[1]=vX;
/*排队*/
eq(q,u);
}
}

1.输入数组是什么样子的

  • 它是如何发起的
  • 空间有什么价值
  • 墙有什么价值
  • 墙中的门或洞口的值是多少(路径的起点和终点)
2.条件(如适用)

  • 某些编译器没有正确执行布尔运算符的计算优先级
  • 尝试将()添加到它们应该位于的位置

    //if(uX == xEnd && uY == yEnd)
    if((uX==xEnd)&&(uY==yEnd))
    
3.邻居约束

  • 您正在忽略范围x:<0,70)y:<0150)之外的邻居
  • 这个上限不应该被你的房间/迷宫大小所取代吗
  • 如果你的房间较小,那么路径可能会绕着你的房间走错方向

我不知道您的其他代码,所以这里是我的诊断。查看输出中的模式:

X
|   (y x)  (1 1)  (0 1)  (1 3)  (0 3)  (1 5)  (0 5)  (1 7)  (0 7)  (1 9)
|   (0 0)  (2 1)  (0 2)  (2 3)  (0 4)  (2 5)  (0 6)  (2 7)  (0 8)  (2 9)
V   (1 0)  (3 1)  (1 2)  (3 3)  (1 4)  (3 5)  (1 6)  (3 7)  (1 8)  (3 9)
    (2 0)  (4 1)  (2 2)  (4 3)  (2 4)  (4 5)  (2 6)  (4 7)  (2 8)  (4 9)
    (3 0)  (5 1)  (3 2)  (5 3)  (3 4)  (5 5)  (3 6)  (5 7)  (3 8)  (5 9)
    (4 0)  (6 1)  (4 2)  (6 3)  (4 4)  (6 5)  (4 6)  (6 7)  (4 8)  (6 9)
    (5 0)  (7 1)  (5 2)  (7 3)  (5 4)  (7 5)  (5 6)  (7 7)  (5 8)  (7 9)
    (6 0)  (8 1)  (6 2)  (8 3)  (6 4)  (8 5)  (6 6)  (8 7)  (6 8)  (8 9)
    (7 0)  (9 1)  (7 2)  (9 3)  (7 4)  (9 5)  (7 6)  (9 7)  (7 8)  (9 9)
    (8 0)  (10 1) (8 2)  (10 3) (8 4)  (10 5) (8 6)  (10 7) (8 8)  (10 9)
在给定列中自上而下遍历,y首先增加,x仅在下一列开始后增加

也在代码的顶行

eq(q,startU);
/*while there are elements in the q*/

因此,基于输出和代码,您似乎并不是在做graph taversal。您所做的是处理队列中的点,在内循环中增加y,在外循环中增加x。您正在使用队列遍历而不是图形遍历来处理数据。

请注意:对于未加权的图形,您不需要Dijkstra。您可以使用广度优先搜索并保存运行时的一个日志因子。另一个不相关的注意事项是:您的X和Y在不同位置的顺序不同(字母顺序、代码行、数组索引、数组维度等)。这需要相当多的注意力才能正确。试着把你的轴命名为其他的东西。也许“row”和“col”(column的缩写)是很好的候选者。你还没有告诉我们。如果在3x3网格上的调试器下运行它会发生什么?我刚刚发布了一个10乘10的网格,有相同的问题,但是这个问题在所有NXM网格中都存在。所以它看起来是一次对两列有效的。你的代码看起来不错-没有容易检测到的bug-所以如果你需要帮助,你应该让它成为可能。另外,请用3x3或3x2替换10x10。我刚刚编辑了很多算法,并说明了prev数组的问题,实际上这是我唯一需要的,所以我去掉了minpath并使用了bfs.1。请尝试使用if((c='+')(c='''.'))|(c='-')|(c='-'))|(c=''.'))2.您确定在回溯que时没有错误吗?3.您写道,您通过将其转换为JAVA进行调试,您在实际应用程序中使用的IDE是什么?您在其中跟踪/断点了吗?在其他编译器上调试代码,然后在原始编译器上使用这些代码,并假设它们都可以工作,这不是一个好主意。。。
eq(q,startU);
/*while there are elements in the q*/