UVA11624 Fire 两次BFS

        题目就懒得粘了。。。

        题意:给出一张图,J表示人的位置,F表示火的位置,.表示路,#表示墙。火每次向四个方向同时移动。问人能不能逃出迷宫,如果能,输出最短时间。

        解题思路:理解了题意就很简单,不过有一点值得注意,这个题目可能有多个着火点,多个!!Wrong answer16次才发现!!然后就很简单了,把所有的起点推进队列进行处理就行了,然后再用个length数组存储火到达改点的最短时间。最后再对人进行BFS,走到一个点的时候判断到达此处的时间跟火到达此处的时间,直到跑到边界就可以跳出。以下是我的AC代码,length数组的初始化也跪了一次

#include 
#include 
#include 
using namespace std;
#include 
#define maxn 1005

int m,n;
int flag[maxn][maxn],success,lenth[maxn][maxn];
char pic[maxn][maxn];
int mm[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
struct trip
{
    int x,y,step;
};
int check1(int x,int y)
{
    if(x<0||x>=m||y<0||y>=n||pic[x][y]=='#'||pic[x][y]=='F') return 1;
    return flag[x][y];
}
int bfs1()
{
    memset(flag,0,sizeof(flag));
    memset(lenth,0x3f3f3f3f,sizeof(lenth));
    queue q;
    trip fff;
    for(int i=0; i=m||y<0||y>=n) return 1;
    return flag[x][y];
}
void bfs2(int r,int s)
{
    queue q;
    trip now,next;
    now.x=r;
    now.y=s;
    now.step=0;
    q.push(now);
    while(!q.empty())
    {
        now=q.front();
        q.pop();
        if(now.x==0||now.x==m-1||now.y==0||now.y==n-1)
        {
            printf("%d\n",now.step+1);
            success=1;
            return;
        }
        for(int i=0; i<4; i++)
        {
            next.x=now.x+mm[i][0];
            next.y=now.y+mm[i][1];
            if(check2(next.x,next.y)) continue;
            if(now.step+1>=lenth[next.x][next.y]) continue;
            next.step=now.step+1;
            flag[next.x][next.y]=1;
            q.push(next);
        }
    }
}
int main()
{
    //freopen("in.txt","r",stdin);
    int t;
    scanf("%d",&t);
    while(t--)
    {
        success=0;
        scanf("%d%d",&m,&n);
        for(int i=0; i

你可能感兴趣的:(图论-BFS)