Dijkstra路径重建

时间:2014-03-09 00:06:13

标签: c algorithm dijkstra

好吧所以我在过去的几个星期里一直试图创造一个像游戏这样的流氓,我现在所困扰的是将地牢中的房间与走廊连接起来。请记住,这一切都在C中,我正在使用ncurses。所以我到目前为止所做的就是将Dijkstra的算法从A门运行到B门记录先前的节点,然后回溯这组先前的节点以获得实际的路径。我的算法目前存在问题,我调试它的步骤是将代码转换为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 0),而不是(1 1)。编辑(我正在添加我的新bfs而不是dijkstra)

eq(q,startU);
/*while there are elements in the q*/
while(dq(q,&u))
{

    uX = u[1];
    uY = u[0];



    /*break if at the end*/
    if(uX == xEnd && uY == yEnd)
    {
        break;
    }
    seen[uY][uX]=1;

    /*Neighbours around the current cell*/
    for(i=0;i<4;++i)
    {

        vX = uX + neighbours[i][1];
        vY = uY + neighbours[i][0];
        if(!bounds(vX,vY)||seen[vY][vX])
        {
            continue;
        }

        c=(char)mvinch(vY,vX);

        if(c == '+'||c=='|'||c=='-'||c=='.')
        {
            continue;
        }

        p->prev[vY][vX][1]=uX;
        p->prev[vY][vX][0]=uY;

        u[0]=vY;
        u[1]=vX;

        /*enqueue*/
        eq(q,u);


    }
}

2 个答案:

答案 0 :(得分:3)

1.输入数组是什么样的

  • 如何启动
  • 空间是什么价值
  • 墙是什么价值
  • 墙上的门或开口是什么价值(路径的起点)

2.conditions(if)

  • 某些编译器没有正确执行布尔运算符的计算优先级
  • 尝试添加()它们应该在哪里......

    //if(uX == xEnd && uY == yEnd)
    if((uX==xEnd)&&(uY==yEnd))
    

3.neighbour约束

  • 你忽略了范围x以外的邻居:&lt; 0,70)y:&lt; 0,150)
  • 不应该用你的房间/迷宫尺寸取代上限吗?
  • 如果你的房间较小,那么路径可能会错误地绕着你的房间......

答案 1 :(得分:1)

我不知道你的其余代码所以这是我的诊断。查看输出中的模式:

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*/

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