UVA - 11624 Fire! 双BFS

还是不叫简单的BFS.在这里贴下代码,重要理解思想.

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define CLR(x) memset(x,0,sizeof(x))
#define ll long long int
#define db double
using namespace std;
const int maxn=1e3+5;
int fx[1000005],fy[1000005];
char maze[maxn][maxn];
int vis[maxn][maxn];
int mx,my;
int cnt=0;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int r,c;
struct point
{
    int x,y,t;
    int type;
};

bool judge(point a)
{
    if(a.type==1)
    {
        if(maze[a.x][a.y]!='#' && vis[a.x][a.y]==0 )//之所以人没加越界条件,因为结束条件是刚好人站在迷宫的最外一层,即这个迷宫在外面是还有一层的.
            return true;//只能用!='#' 而不能用=='.'因为我们是要求人是要走出去的,而前者的判定条件人才能走出去,而后者人就不能走出去了.
        return false;
    }
    else if(a.type==2)
    {
        if(a.x>=1 && a.y >=1 && a.x<=r && a.y<=c && maze[a.x][a.y]!='#' && vis[a.x][a.y]!=2)//只不能走走过的点.
            return true;//而火是不能走出去的.这个条件也可以合并为if(maze[a.x][a.y]=='.' && vis[a.x][a.y]!=2)
        return false;
    }
}

int bfs()
{
    point a;
    queueq;
    a.x=mx,a.y=my;
    a.t=0,a.type=1;
    vis[a.x][a.y]=a.type;
    q.push(a);
    for(int i=0;i

如果不是很懂的话,就把我注释的地方划去,把每一步打出来看就知道意思了.

你可能感兴趣的:(UVA - 11624 Fire! 双BFS)