(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 }
原文地址:https://www.cnblogs.com/quintessence/p/6032595.html