初学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 }