bfs走迷宫记录最短路径(求大神指…

老师在c高级课上说要叫我们做一个走迷宫的游戏,关键还要叫我们设置一个可以自动走完的事例。
老师在屏幕上显示了一遍,但那个不是按最短路径走的,有些情况还走不出,我想做一个按最短路径走的。
之前接触过搜索,老师一提出这个问题我就想到了搜索,但是写的时候发现对我这个菜鸟来说不容易。最短路径当然是bfs,但是有发现因为有队列不好记录。于是,没办法只能按烦的办法来,真心希望大神们给点简便的办法。
我的想法是在记录位置的结构体中加一个字符数组,用来记录之前的所有路径。
#include
#include
int a1,b1,a2,b2,n,m,str[4][2]={{-1,0},{1,0},{0,-1},{0,1}},flag[1200][1200];
int head=0,end=2;
char p[1200][1200];
struct
{
    int x,y;
    char sx[1200],sy[1200];   //之前的最短路径x,y
}a[1200];
void bfs(int x,int y)
{
    int i,tx,ty;
    a[head+1].x=x;
    a[head+1].y=y;
    while(head
    {
        head++;
        for(i=0;i<=3;i++)
        {
            tx=a[head].x+str[i][0];
            ty=a[head].y+str[i][1];
            if(p[tx][ty]=='G')           //到终点
            {
                a[end].x=tx;
                a[end].y=ty;
                strcpy(a[end].sx,a[head].sx);     //复制之前的路径
                strcpy(a[end].sy,a[head].sy);
                a[end].sx[strlen(a[end].sx)]='0'+tx;
                a[end].sy[strlen(a[end].sy)]='0'+ty;
                return ;
            }
            if(p[tx][ty]!='#'&&tx>=0&&tx<=n-1&&ty>=0&&ty<=m-1&&flag[tx][ty]==0)
            {
                flag[tx][ty]=1;
                a[end].x=tx;
                a[end].y=ty;
                strcpy(a[end].sx,a[head].sx);     //复制之前的路径
                strcpy(a[end].sy,a[head].sy);
                a[end].sx[strlen(a[end].sx)]='0'+tx;
                a[end].sy[strlen(a[end].sy)]='0'+ty;
                end++;
            }
        }
    }
}
int main()
{
    int i,j;
    scanf("%d%d",&n,&m);   getchar();
    for(i=0;i<=n-1;i++)
    {
    for(j=0;j<=m-1;j++)
    {

        scanf("%c",&p[i][j]);
        if(p[i][j]=='S')         //起点
        a1=i,b1=j;
        if(p[i][j]=='G')         //终点
        a2=i,b2=j;
    }
    getchar();
    }
    bfs(a1,b1);
    printf("%c %c\n",a1,b1);
    for(i=0;i<=strlen(a[end].sx)-1;i++)       //输出到终点是之前的路径
    {
        printf("%c %c\n",a[end].sx[i],a[end].sy[i]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值