UVA 11624 Fire!-多源BFS

和普通BFS一样,不过要注意的是有火的个子和出界的格子不能加入队列,注意判断一下在push进队列即可。


/****************************
* author:crazy_石头
* date:2014/02/25
* algorithm:bfs
* Pro:UVA 11264
***************************/
#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
      
#include 
      
      
       
       
#include 
       
       
         #include 
        
          #include 
         
           #include 
          
            using namespace std; #define INF 1<<29 #define eps 1e-8 #define A system("pause") #define rep(i,h,n) for(int i=(h);i<=(n);i++) #define ms(a,b) memset((a),(b),sizeof(a)) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 const int maxn=2000+5; int dx[]={0,1,-1,0}; int dy[]={1,0,0,-1}; struct dot { int x,y; bool isfire; int time; }; int vis[maxn][maxn]; char map[maxn][maxn]; int test,n,m; inline bool in(dot sgx) { if(sgx.x>=0&&sgx.x 
           
             =0&&sgx.y 
            
              q; while(!q.empty()) q.pop(); ms(vis,0); rep(i,0,n-1) rep(j,0,m-1) { if(map[i][j]=='J') gx.x=i,gx.y=j,gx.isfire=0,gx.time=0; else if(map[i][j]=='F') vis[i][j]=1,q.push((dot){i,j,1,0}); else if(map[i][j]=='#') vis[i][j]=1; } q.push(gx); int ret=0; while(!q.empty()) { dot st,next; gx=q.front(),q.pop(); rep(i,0,3) { next.x=gx.x+dx[i]; next.y=gx.y+dy[i]; next.isfire=gx.isfire;//BFS的时候注意"火势蔓延",相邻格子火势是相通的; next.time=gx.time+1; if(in(next)) { if(!vis[next.x][next.y]) vis[next.x][next.y]=1,q.push(next); } else if(next.isfire==0) { ret=next.time;//记录当前答案; break; } } if(ret>0)break; } if(!ret) std::puts("IMPOSSIBLE"); else printf("%d\n",ret); } //A; return 0; } 
             
            
           
          
         
       
      
      
     
     
    
    
   
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值