• (BFS)hdoj1242-Rescue


    题目地址

    初学BFS,第一次用BFS做题。题目就是一个基本的BFS模型,需要稍加注意的是遇到警卫时间要+1,以及最后比的是最短的时间而不是步数。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #define s 205
     5 #define INF 100000
     6 using namespace std;
     7 struct lo//建立结构体,存储点坐标和某种方法走到这里话费的步数和时间
     8 {
     9     int x,y,step,time;
    10 };
    11 queue<lo> q;//建立队列,存放结点
    12 int mintime[s][s],dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}},m,n,si,sj,ei,ej;//si、sj存储起点,mintime存储到某点最短时间,初始化为INF
    13 char tem[s][s];//存储地图
    14 int BFS(lo x)
    15 {
    16     int i;
    17     q.push(x);
    18     lo hd;
    19     while(!q.empty())//为找到最优解,需要等到队列为空才能停止
    20     {
    21         hd=q.front();//拿出队列头,从队列头的结点开始继续走。
    22         q.pop();
    23         for(i=0;i<4;i++)
    24         {
    25             int x=hd.x+dir[i][0],y=hd.y+dir[i][1];
    26             if(x>=0&&x<m&&y>=0&&y<n&&tem[x][y]!='#')//如果朝某个方向走一步可行,那么就判断这样是否是最短。若是,则压入
    27             {
    28                 lo t;
    29                 t.x=x;t.y=y;t.time=hd.time+1;t.step=hd.step+1;
    30                 if(tem[x][y]=='x')  t.time++;//如果是警卫,时间要+1
    31                 if(t.time<mintime[x][y])//或许有走到这里时间更短的方法,但既然每种都放入了队列,后来都会从这里继续走
    32                 {mintime[x][y]=t.time;
    33                 q.push(t);
    34                 }
    35             }
    36         }
    37     }
    38     return mintime[ei][ej];//返回答案
    39 }
    40 int main()
    41 {
    42     while(~scanf("%d%d",&m,&n))
    43     {
    44         memset(tem,0,sizeof(tem));
    45         int i,j,an;
    46         for(i=0;i<m;i++)
    47         {
    48             scanf("%s",tem[i]);
    49         }
    50         for(i=0;i<m;i++)
    51         {
    52             for(j=0;j<n;j++)
    53             {
    54                 mintime[i][j]=INF;//初始化时间都为INF
    55                 if(tem[i][j]=='a')
    56                 {
    57                     ei=i;ej=j;
    58                 }
    59                 else if(tem[i][j]=='r')
    60                 {
    61                     si=i;sj=j;
    62                 }
    63             }
    64         }
    65         lo t;
    66         t.x=si;t.y=sj;t.step=0;t.time=0;mintime[si][sj]=0;
    67         an=BFS(t);
    68         if(an<INF)
    69             printf("%d
    ",an);
    70         else
    71             printf("Poor ANGEL has to stay in the prison all his life.
    ");
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    图的广度优先遍历,运用了数据结构,感觉非常好用,等会把深度优先遍历也用数据结构写一遍
    DFS之素数环问题
    图的深度优先遍历
    八皇后的详细解答,纯手打,求推荐!!!
    c++中priority_queue的用法
    c++中vector的用法
    #ifndef是什么意思????
    筛法求1000000以内素数个数---时间复杂度为o(n)
    C++中1/0和1/0.0的区别
    C++程序生成.exe文件,在文件夹中运行时闪现问题
  • 原文地址:https://www.cnblogs.com/quintessence/p/6032595.html
Copyright © 2020-2023  润新知