UVA11624 【Fire!】

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <queue>
 5 #define maxn 1010
 6 using namespace std;
 7 
 8 char s[maxn][maxn];
 9 int g[maxn][maxn];
10 int T,n,m;
11 int dx[4]={0,1,0,-1};
12 int dy[4]={1,0,-1,0};
13 
14 bool inside(int cx,int cy)
15 {
16     return cx>0 && cx<=n && cy>0 && cy<=m;
17 }
18 
19 bool border(int cx,int cy)
20 {
21     return cx==1 || cx==n || cy==1 || cy==m;
22 }
23 
24 void init_fire()
25 {
26     for (int i=1; i<=n; i++)
27         for (int j=1; j<=m; j++) g[i][j]=99999999;
28     queue<int> qx,qy;
29     for (int i=1; i<=n; i++)
30         for (int j=1; j<=m; j++)
31             if (s[i][j]=='F') qx.push(i),qy.push(j),g[i][j]=0;
32     while (!qx.empty())
33     {
34         int cx=qx.front(),cy=qy.front();
35         qx.pop(),qy.pop();
36         for (int i=0; i<4; i++)
37         {
38             if (!inside(cx+dx[i],cy+dy[i])) continue;
39             if (s[cx+dx[i]][cy+dy[i]]!='.') continue;
40             if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue;
41             g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1;
42             qx.push(cx+dx[i]),qy.push(cy+dy[i]);
43         }
44     }
45 }
46 
47 int bfs()
48 {
49     queue<int> qx,qy;
50     for (int i=1; i<=n; i++)
51         for (int j=1; j<=m; j++)
52             if (s[i][j]=='J')
53             {
54                 g[i][j]=0;
55                 qx.push(i),qy.push(j);
56                 if (border(i,j)) return 1;
57             }
58     while (!qx.empty())
59     {
60         int cx=qx.front(),cy=qy.front();
61         qx.pop(),qy.pop();
62         for (int i=0; i<4; i++)
63         {
64             if (s[cx+dx[i]][cy+dy[i]]!='.') continue;
65             if (g[cx][cy]+1>=g[cx+dx[i]][cy+dy[i]]) continue;
66             if (border(cx+dx[i],cy+dy[i])) return g[cx][cy]+2;
67             g[cx+dx[i]][cy+dy[i]]=g[cx][cy]+1;
68             qx.push(cx+dx[i]),qy.push(cy+dy[i]);
69         }
70     }
71     return -1;
72 }
73 
74 int main()
75 {
76     scanf("%d",&T);
77     while (T--)
78     {
79         scanf("%d%d",&n,&m);
80         for (int i=1; i<=n; i++) scanf("%s",s[i]+1);
81         init_fire();
82         int ans=bfs();
83         if (ans==-1) puts("IMPOSSIBLE");
84             else printf("%d\n",ans);
85 
86     }
87     return 0;
88 }

猜你喜欢

转载自www.cnblogs.com/zytwan/p/9931530.html
今日推荐