1. 程式人生 > >UVA 11624

UVA 11624

oss flag ++ using ring sin == nod ret

可能有多個著火點。

進行兩次bfs。先將著火點預處理,記錄地圖中每個點被燃燒的最短時間,再讓J開始走,每一步走的時間必須小於該點被燃燒的最短時間。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cmath>
  4 #include <cstring>
  5 #include <algorithm>
  6 #include <queue>
  7 using namespace std;
  8 struct node
  9 {
 10     int
x,y,step; 11 }s,f[1000]; 12 char a[1010][1010]; 13 int fir[1010][1010],vis[1010][1010],n,m,flag,k; 14 int dir[4][2]={-1,0,1,0,0,-1,0,1}; 15 void bfs1() 16 { 17 node temp,next; 18 queue<node>q; 19 for(int i=0;i<k;i++) 20 q.push(f[i]); 21 while(!q.empty()) 22 { 23 temp=q.front();
24 q.pop(); 25 if(fir[temp.x][temp.y]>temp.step) 26 fir[temp.x][temp.y]=temp.step; 27 for(int i=0;i<4;i++) 28 { 29 next.x=temp.x+dir[i][0]; 30 next.y=temp.y+dir[i][1]; 31 next.step=temp.step+1; 32 if(next.x>=0
&&next.y>=0&&next.x<n&&next.y<m&&a[next.x][next.y]!=#&&vis[next.x][next.y]==0) 33 { 34 q.push(next); 35 vis[next.x][next.y]=1; 36 } 37 38 } 39 } 40 } 41 void bfs() 42 { 43 node temp,next; 44 queue<node>q; 45 q.push(s); 46 while(!q.empty()) 47 { 48 temp=q.front(); 49 q.pop(); 50 for(int i=0;i<4;i++) 51 { 52 next.x=temp.x+dir[i][0]; 53 next.y=temp.y+dir[i][1]; 54 next.step=temp.step+1; 55 if(next.x<0||next.y<0||next.x>=n||next.y>=m) 56 { 57 printf("%d\n",next.step); 58 flag=1; 59 return; 60 } 61 if(a[next.x][next.y]!=#&&vis[next.x][next.y]==0&&next.step<fir[next.x][next.y]) 62 { 63 q.push(next); 64 vis[next.x][next.y]=1; 65 } 66 67 } 68 } 69 } 70 int main(int argc, char *argv[]) 71 { 72 int t; 73 scanf("%d",&t); 74 while(t--) 75 { 76 scanf("%d%d",&n,&m); 77 for(int i=0;i<n;i++) 78 scanf("%s",a[i]); 79 memset(fir,0x3f,sizeof(fir)); 80 memset(vis,0,sizeof(vis)); 81 k=0; 82 for(int i=0;i<n;i++) 83 for(int j=0;j<m;j++) 84 { 85 if(a[i][j]==J) 86 { 87 s.x=i;s.y=j;s.step=0; 88 } 89 if(a[i][j]==F) 90 { 91 f[k].x=i;f[k].y=j;f[k].step=0; 92 vis[f[k].x][f[k].y]=1;k++; 93 } 94 } 95 96 97 bfs1(); 98 flag=0; 99 memset(vis,0,sizeof(vis)); 100 bfs(); 101 if(!flag) 102 printf("IMPOSSIBLE\n"); 103 } 104 return 0; 105 }

UVA 11624