zoj 1649(bfs+二次入队列)

来源:互联网 发布:免费手机阅读软件 编辑:程序博客网 时间:2024/05/16 15:30

题意:最短时间内被伙伴找到,

思路:因为有多个伙伴,所以可以公主找伙伴,bfs就好,守卫需要2s,遇到守卫二次入队列就行了.

#include <stdio.h>#include <string.h>#define MAX 300#define Max(a,b) a>b?a:b#define Min(a,b) a<b?a:bchar map[MAX][MAX];int n,m;int visit[MAX][MAX];int to[4][2]={1,0,-1,0,0,1,0,-1};int que[MAX*MAX][3];int check(int x,int y){if(x<0||y<0||x>=n||y>=m||visit[x][y]||map[x][y]=='#')return 0;return 1;}void bfs(int x,int y){int i,j,qqq;visit[x][y]=1;que[0][0]=x;que[0][1]=y;que[0][2]=0;qqq=1;i=0;while(i<qqq){if(map[que[i][0]][que[i][1]]=='r')break;if(map[que[i][0]][que[i][1]]=='x'&&visit[que[i][0]][que[i][1]]==2){que[qqq][0]=que[i][0];que[qqq][1]=que[i][1];que[qqq][2]=que[i][2]+1;qqq++;visit[que[i][0]][que[i][1]]=1;i++;continue;}for(j=0;j<4;j++){if(check(que[i][0]+to[j][0],que[i][1]+to[j][1])){que[qqq][0]=que[i][0]+to[j][0];que[qqq][1]=que[i][1]+to[j][1];que[qqq][2]=que[i][2]+1;if(map[que[i][0]+to[j][0]][que[i][1]+to[j][1]]!='x')visit[que[qqq][0]][que[qqq][1]]=1;else visit[que[qqq][0]][que[qqq][1]]=2; qqq++;}}i++;}if(i==qqq)printf("Poor ANGEL has to stay in the prison all his life.\n");else printf("%d\n",que[i][2]);return ;}int main(){int i,j,x,y; while(~scanf("%d%d",&n,&m)){ getchar(); memset(visit,0,sizeof(visit)); for(i=0;i<n;i++){ for(j=0;j<m;j++){ scanf("%c",&map[i][j]); if(map[i][j]=='a'){ x=i; y=j; } } getchar(); } bfs(x,y); }    return 0;}

0 0
原创粉丝点击