广度首先搜索获取路径

时间:2014-03-11 02:41:13

标签: c algorithm breadth-first-search

所以我一直在C中创建一个游戏,你从一堆房间开始,你必须将它们连接到走廊,所以我一直在做的是在屏幕上运行bfs,然后通过whereFrom阵列。但是到目前为止它只有在xStart和yStart是(0,0)时才有效,如果它们是输出中出现的奇怪的东西,我将首先向你显示我的代码。

u[0]=yStart;
u[1]=xStart;
eq(q,u);
int count = 0;

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

    uX = u[1];
    uY = u[0];
    /*if(uX ==3)
    mvprintw(++count,10,"%d %d",uY,uX);
    */


    /*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=map[vY][vX];

        if((c == '+')||(c=='|')||(c=='-')||(c=='.'))
        {
            continue;
        }
        if((p->prev[vY][vX][0]==9999)&&(p->prev[vY][vX][1]==9999))
        {
            p->prev[vY][vX][1]=uX;
            p->prev[vY][vX][0]=uY;
        }
        u[0]=vY;
        u[1]=vX;

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


    }
}

uX = xEnd;
uY = yEnd;
coord = malloc(sizeof(int)*2);


while((uX<COL)&&(uY<ROW)&&(p->prev[uY][uX][0]!=9999)&&(p->prev[uY][uX][1]!=9999))
{
    count++;
    coord[0]=uY;
    coord[1]=uX;

    uY = p->prev[uY][uX][0];
    uX = p->prev[uY][uX][1];
    if((uY!=coord[0])&&(coord[1]!=uX))
    {
        c = map[coord[0]][uX];
        if((c == '|')||(c=='-')||(c=='+')||(c=='.'))
        {
            p->screen[uY][coord[1]]=1;
        }
        else
        {
            p->screen[coord[0]][uX]=1;
        }
    }
    p->screen[coord[0]][coord[1]]=1
}

因此,即使我取出所有墙壁和障碍物,如果它从(0,0)开始,它只会构造一条路径,如果xStart和yStart非零,则路径甚至不会显示。顺便说一句,dq和eq分别出列和排队,并且它们完美地工作,我已经测试过了。

0 个答案:

没有答案