UVA 11624 - Fire! 图BFS
昨天晚上UVA上不去今天晚上才上得去,这是在维护么?
然后去看了JAVA,感觉还不错昂~
晚上上去UVA后经常连接失败作死啊。
第一次做图的题~
基本是照着抄的T T
不过搞懂了图的BFS,虽然不像二叉树的BFS那么直观。
#include<cstdio> #include<queue> #include<vector> #include<cstring> #include<algorithm> using namespace std; const int MAXN=1000+24; const int INF=9999999; int R,C,jr,jc,d[MAXN][MAXN][2],ans; bool vis[MAXN][MAXN][2]; char maze[MAXN][MAXN]; const int dir_r[4]={1,-1,0,0}; const int dir_c[4]={0,0,1,-1}; struct site { int r,c; site(int i,int j): r(i),c(j){} }; queue<site> Q; void bfs(int kind) { while(!Q.empty()) { int r=Q.front().r,c=Q.front().c; Q.pop(); for(int i=0;i<4;i++) { int r_now=r+dir_r[i],c_now=c+dir_c[i]; if(r_now>=0 && r_now<R && c_now>=0 && c_now<C && maze[r_now][c_now] == '.' && vis[r_now][c_now][kind]==false) { Q.push(site(r_now,c_now)); vis[r_now][c_now][kind] = true; d[r_now][c_now][kind] = d[r][c][kind] + 1; } } } } void check(int r,int c) { if(maze[r][c]!='.' || vis[r][c][0]==false) return; if( vis[r][c][1]==0 || d[r][c][0]<d[r][c][1] ) ans = min(ans, d[r][c][0] + 1); } int main() { int T; scanf("%d",&T); while(T--) { memset(vis, 0, sizeof(vis)); memset(d, 0, sizeof(d)); vector<site> fire; //input scanf("%d%d",&R,&C); for(int i=0;i<R;i++) { scanf("%s",maze[i]); for(int j=0;j<C;j++) { if(maze[i][j]=='J'){ jr=i; jc=j; maze[i][j] = '.'; } else if(maze[i][j]=='F') { fire.push_back(site(i,j)); maze[i][j] = '.'; } } } //joe vis[jr][jc][0]=true; d[jr][jc][0]=0; Q.push(site(jr,jc)); bfs(0); //Fire; for(int i=0;i<fire.size();i++) { vis[fire[i].r][fire[i].c][1] = true; d[fire[i].r][fire[i].c][1] = 0; Q.push(fire[i]); } bfs(1); //answer ans=INF; for(int i=0;i<R;i++) { check(i,0);check(i,C-1); } for(int i=0;i<C;i++) { check(0,i);check(R-1,i); } if(ans == INF) printf("IMPOSSIBLE\n"); else printf("%d\n", ans); } }
新 blog : www.hrwhisper.me