简单版贪吃蛇(3128)BFS

解题思路:BFS加路径。用广搜求出最短路径,用biao结构体保存每个最短路径的前一步。通过终点依次存下前一步的坐标,一直到起点,最后判断方向输出。
  1 #include <cstring>
  2 #include <cstdio>
  3 #include <iostream>
  4 #include <algorithm>
  5 using namespace std;
  6 char tu[105][105];                  
  7 int n,m;
  8 int startx,starty,endx,endy;
  9 int head,tail,xx,yy;
 10 int dir[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
 11 struct dui
 12 {
 13     int x,y,s;     
 14 };
 15 dui que[10500];
 16 struct biao
 17 {
 18     int x1,y1;
 19 }road[105][105];
 20 int bfs()             //返回最短路径的步数
 21 {                      
 22    head=tail=0;
 23    tail++;
 24    que[tail].x=startx;
 25    que[tail].y=starty;
 26    que[tail].s=0;
 27    while(head<tail)
 28    {
 29        head++;
 30        if(que[head].x==endx&&que[head].y==endy)
 31            return que[head].s;
 32        for(int i=0;i<4;i++)
 33        {
 34             xx=que[head].x+dir[i][0];
 35             yy=que[head].y+dir[i][1];
 36            if(xx>=1&&xx<=n&&yy>=1&&yy<=m)
 37            {
 38                if(tu[xx][yy]!='#')
 39                    {
 40                     tu[xx][yy]='#';            //走过的路标记为#
 41                    tail++;
 42                    que[tail].s=que[head].s+1;
 43                    que[tail].x=xx;
 44                    que[tail].y=yy;
 45                    road[xx][yy].x1=que[head].x;       //保存前一步
 46                    road[xx][yy].y1=que[head].y;
 47                    }
 48            }
 49        }
 50    }
 51    return 0;
 52 }
 53 int main()
 54 {
 55     while(~scanf("%d%d",&n,&m))
 56     {
 57         memset(que,0,sizeof(que));
 58         memset(road,0,sizeof(road));
 59         memset(tu,0,sizeof(tu));
 60         for(int i=1;i<=n;i++)
 61             for(int j=1;j<=m;j++)
 62             {
 63             cin>>tu[i][j];
 64             if(tu[i][j]=='S')
 65                 startx=i,starty=j;
 66             if(tu[i][j]=='E')
 67                 endx=i,endy=j;
 68             }
 69         tu[startx][starty]='#';
 70        int sum=bfs();
 71        dui ans[105];
 72        if(sum==0)               //找不到路径返回0,就是吃不到。
 73        {
 74            printf("Can't eat it!\n");        
 75            continue;
 76        }
 77        int ex=endx,ey=endy;
 78        for(int i=1;i<=sum;i++)      //依次保存上一步坐标
 79        {
 80            ans[i].x=road[ex][ey].x1;
 81            ans[i].y=road[ex][ey].y1;
 82            ex=ans[i].x;
 83            ey=ans[i].y;
 84        }
 85        ans[0].x=endx;ans[0].y=endy;
 86        for(int i=sum-1;i>=0;i--)            //判断方向并输出
 87        {
 88           int dx=ans[i].x-ans[i+1].x;
 89           int dy=ans[i].y-ans[i+1].y;
 90           if(dx==1)
 91             printf("S");
 92           if(dx==-1)
 93             printf("N");
 94           if(dy==1)
 95             printf("E");
 96           if(dy==-1)
 97             printf("W");
 98        }
 99        printf("\n");
100     }
101     return 0;
102 }

 

 

转载于:https://www.cnblogs.com/zou-zou/p/5320559.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值