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

来源:互联网 发布:指针指向数组 编辑:程序博客网 时间:2024/06/05 20:13
老师在c高级课上说要叫我们做一个走迷宫的游戏,关键还要叫我们设置一个可以自动走完的事例。
老师在屏幕上显示了一遍,但那个不是按最短路径走的,有些情况还走不出,我想做一个按最短路径走的。
之前接触过搜索,老师一提出这个问题我就想到了搜索,但是写的时候发现对我这个菜鸟来说不容易。最短路径当然是bfs,但是有发现因为有队列不好记录。于是,没办法只能按烦的办法来,真心希望大神们给点简便的办法。
我的想法是在记录位置的结构体中加一个字符数组,用来记录之前的所有路径。
#include
#include
inta1,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]);
    }
}