uva 11624 Fire!(迷宫问题加 着火 两次bfs)

来源:互联网 发布:淘宝如何抢到现货 编辑:程序博客网 时间:2024/04/28 07:09
一开始忘记标记bfs2的vis数组 T了一次

bfs1 就是说 以着火点 bfs 标记一个数组 就是每个点着火的最小的时间
bfs2 就是看到达那个点的时候 时间是不是小于着火时间
 
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn=1001;const int inf=1<<30;char str[maxn];char map[maxn][maxn];int tim[maxn][maxn];bool vis[maxn][maxn];int n,m,xpos,ypos;int dir[4][2]={1,0,-1,0,0,1,0,-1};struct Node{    int x,y;};struct No{    int x,y,t;};void bfs1();void bfs2();int main(){    int T,i,j;    scanf("%d",&T);    while(T--)    {        scanf("%d %d",&n,&m);        memset(vis,0,sizeof(vis));        for(i=0;i<n;++i)        {            scanf("%s",str);            for(j=0;j<m;++j)            {                map[i][j]=str[j];                if(map[i][j]=='F')                tim[i][j]=0;                else                tim[i][j]=inf;                if(map[i][j]=='J')                {                    xpos=i;                    ypos=j;                    map[i][j]='.';                }            }        }        bfs1();        bfs2();    }    return 0;}void bfs1(){    int i,j;    queue<Node> q;    Node node,no;    for(i=0;i<n;++i)    {        for(j=0;j<m;++j)        {            if(map[i][j]=='F')            {                no.x=i;no.y=j;                q.push(no);            }        }    }    while(!q.empty())    {        node=q.front();        q.pop();        for(i=0;i<4;++i)        {            no.x=node.x+dir[i][0];            no.y=node.y+dir[i][1];            if(map[no.x][no.y]=='.' && no.x>=0 && no.x<n && no.y>=0 && no.y<m && tim[node.x][node.y]+1<tim[no.x][no.y])            {                q.push(no);                tim[no.x][no.y]=tim[node.x][node.y]+1;            }        }    }}void bfs2(){    No node,no;    int i,j;    node.x=xpos;    node.y=ypos;    node.t=0;    queue<No> q;    q.push(node);    vis[node.x][node.y]=1;    while(!q.empty())    {        node=q.front();        q.pop();        if(node.x==0 || node.x==n-1 || node.y==0 || node.y==m-1)        {            printf("%d\n",node.t+1);            return ;        }        for(i=0;i<4;++i)        {            no.x=node.x+dir[i][0];            no.y=node.y+dir[i][1];            no.t=node.t+1;            if(!vis[no.x][no.y]&&no.x>=0 && no.x<n && no.y>=0 && no.y<m && no.t<tim[no.x][no.y] && map[no.x][no.y]=='.')            {                vis[no.x][no.y]=1;                q.push(no);            }        }    }    puts("IMPOSSIBLE");}

原创粉丝点击