码迷,mamicode.com
首页 > 其他好文 > 详细

Fire!

时间:2014-05-30 03:18:05      阅读:296      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   tar   

uva11624:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=2671

题意:一个大火蔓延的迷宫。Joe每分钟可以走到上下左右4个方向的相邻格之一,而所有着火的格子都会往四周蔓延(即如果某个空格与着火格子有公共边,则下一分钟这个格子将会着火。)迷宫中有一些障碍,Joe和火都无法进入。当Joe走到一个迷宫的边界格子时,我们认为他已经出了迷宫。

题解:把每个着火点作为起点,做一遍BFS,得出每个格子的着火时间,然后以人的坐标为起点,做一遍BFS,此时判断条件是下一个格子的着火时间要比当前时间晚,下一个格子才可以进去。然后BFS之后,判断边界的的最小值即可。

bubuko.com,布布扣
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #define INF 1000000000
  7 using namespace std;
  8 const int N=1002;
  9 struct Node{
 10    int x;
 11    int y;
 12    int step;
 13 };
 14 queue<Node>Q2;
 15 int counts1[N][N];
 16 int counts2[N][N];
 17 int ct[N][N];
 18 int n,m;
 19 char map[N][N];
 20 void BFS(){
 21     int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
 22     while(!Q2.empty()){
 23         Node tp=Q2.front();
 24         Q2.pop();
 25         for(int i=0;i<4;i++){
 26             int xx=dir[i][0]+tp.x;
 27             int yy=dir[i][1]+tp.y;
 28             if(xx>=1&&xx<=n&&yy>=1&&yy<=m){
 29                 if(map[xx][yy]!=#&&tp.step+1<counts1[xx][yy]){
 30                     Node ttt;
 31                     ttt.x=xx;
 32                     ttt.y=yy;
 33                     ttt.step=tp.step+1;
 34                     counts1[xx][yy]=tp.step+1;
 35                     Q2.push(ttt);
 36                 }
 37 
 38             }
 39         }
 40     }
 41 }
 42 int BFS1(int x,int y){
 43     int dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
 44     for(int i=1;i<=n;i++)
 45         for(int j=1;j<=m;j++)
 46           counts2[i][j]=INF;
 47     queue<Node>Q;
 48     Node temp;
 49     temp.x=x;
 50     temp.y=y;
 51     temp.step=0;
 52     Q.push(temp);
 53     counts2[x][y]=0;
 54     while(!Q.empty()){
 55         Node tp=Q.front();
 56         Q.pop();
 57         for(int i=0;i<4;i++){
 58             int xx=dir[i][0]+tp.x;
 59             int yy=dir[i][1]+tp.y;
 60             if(xx>=1&&xx<=n&&yy>=1&&yy<=m){
 61                 if(tp.step+1<counts1[xx][yy]&&map[xx][yy]!=#&&tp.step+1<counts2[xx][yy]){
 62                     Node ttt;
 63                     ttt.x=xx;
 64                     ttt.y=yy;
 65                     ttt.step=tp.step+1;
 66                     counts2[xx][yy]=tp.step+1;
 67                     Q.push(ttt);
 68                 }
 69 
 70             }
 71         }
 72     }
 73     int minn=INF;
 74    for(int i=1;i<=n;i++)
 75     minn=min(counts2[i][m],min(minn,counts2[i][1]));
 76    for(int i=1;i<=m;i++)
 77     minn=min(counts2[1][i],min(minn,counts2[n][i]));
 78      return minn;
 79 }
 80 void  init(){
 81    while(!Q2.empty())
 82             Q2.pop();
 83         for(int i=1;i<=n;i++)
 84         for(int j=1;j<=m;j++)
 85           counts1[i][j]=INF;
 86 }
 87 int sx,sy;
 88 int main(){
 89     int test;
 90     scanf("%d",&test);
 91     while(test--){
 92             scanf("%d%d",&n,&m);
 93               init();
 94         for(int i=1;i<=n;i++)
 95             for(int j=1;j<=m;j++){
 96                cin>>map[i][j];
 97                if(map[i][j]==F){
 98                     Node ttp;
 99                     ttp.x=i;
100                     ttp.y=j;
101                     ttp.step=0;
102                     Q2.push(ttp);
103                     counts1[i][j]=0;
104                }
105                if(map[i][j]==J){
106                      sx=i;
107                      sy=j;
108                }
109             }
110 
111             BFS();
112          int ans=BFS1(sx,sy);
113          if(ans==INF)printf("IMPOSSIBLE\n");
114          else printf("%d\n",ans+1);
115     }
116 }
View Code

 

Fire!,布布扣,bubuko.com

Fire!

标签:c   style   class   blog   code   tar   

原文地址:http://www.cnblogs.com/chujian123/p/3757738.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!