zoukankan      html  css  js  c++  java
  • 简单版贪吃蛇(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!
    ");        
     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("
    ");
    100     }
    101     return 0;
    102 }
  • 相关阅读:
    mysql查询字段时实现左右补零
    两种方法获取MyBatis刚刚插入的id
    SpringBoot扫描包提示找不到mapper的问题
    如何删除mac keeper
    mongodb如何设置主键自增
    java数组和字符串相互转换
    algid parse error, not a sequence错误
    java数字转换成文字方法
    maven的groupid和artifactId
    mysql中的日期转换函数(类似oracle中的to_date)
  • 原文地址:https://www.cnblogs.com/zou-zou/p/5320559.html
Copyright © 2011-2022 走看看