• (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 }
  • 相关阅读:
    Linux设备驱动
    Android:注册登录
    Android:ZoomControls控件
    每日英语:Some Chinese Students Stay Home to Get Ahead
    每日英语:March Remembers King's Dream
    每日英语:Hong Kong Lifestyle Strains City's Resources
    每日英语:Prosecutors Wrap Up Case Against Bo
    每日英语:He Diets, She Diets: More Weight-Loss Plans Target Men
    每日英语:First Offer: Take It Or Keep Waiting?
    每日英语:Does Evolution Want Us To Be Unhappy?
  • 原文地址:https://www.cnblogs.com/quintessence/p/6032595.html
Copyright © 2020-2023  润新知