UVA 11624 Fire!(BFS广搜)

传送门
||os[jx][jy]==-1))没有火或者火无法蔓延到的地方

#include <bits/stdc++.h>
using namespace std;
char los[1009][1009];
int os[1009][1009],n,m;
int yy[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
struct ot{int x,y,z;};
queue<ot>ff;
bool check(int a,int b,int n,int m){return a>=0&&a<n&&b>=0&&b<m;}
int jjbfs(int x,int y){
    queue<ot>jj;
    los[x][y]='#';
    jj.push({x,y,0});
     while(!jj.empty()){
        ot q=jj.front();
        jj.pop();
        if(q.x==0||q.x==n-1||q.y==0||q.y==m-1)
            return q.z+1;
        for(int i=0;i<4;i++){
            int jx=q.x+yy[i][0];
            int jy=q.y+yy[i][1];
            if(check(jx,jy,n,m)&&los[jx][jy]!='#'&&(os[jx][jy]>q.z+1||os[jx][jy]==-1)){//没有火或者火无法蔓延到的地方
                los[jx][jy]='#';
                jj.push({jx,jy,q.z+1});
            }
        }
    }
    return 0;
}
int main()
{
    int t,i,j,fx,fy,x,y;
    ot w;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        memset(os,-1,sizeof(os));
        for(i=0;i<n;i++)
            for(j=0;j<m;j++){
                cin>>los[i][j];
                //scanf(" %c",&los[i][j]);空格很重要!!!不写会比较麻烦
                if(los[i][j]=='J'){
                    x=i;
                    y=j;
                }
                if(los[i][j]=='F'){
                    ff.push({i,j,0});
                    os[i][j]=0;
                }
            }
        while(!ff.empty()){
            w=ff.front();
            ff.pop();
            for(i=0;i<4;i++){
                fx=w.x+yy[i][0];fy=w.y+yy[i][1];
                if(check(fx,fy,n,m)&&los[fx][fy]!='#'&&os[fx][fy]==-1){
                    os[fx][fy]=w.z+1;
                    //os[fx][fy]=os[w.x][w.y]+1;
                    ff.push({fx,fy,w.z+1});
                }
            }
        }
        int f=jjbfs(x,y);
        if(!f)
            cout<<"IMPOSSIBLE"<<endl;
        else
            cout<<f<<endl;
    }
     return 0;
}

如果把jjfbs()写在主函数里,每组过后要清空放人的队列,队列没有.clear
可以用

void clear(queue &q){
	queue<ot>empty;
	swap(empty,q);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值