bfs hdu 1728 逃离迷宫

来源:互联网 发布:mac命令行date修改时间 编辑:程序博客网 时间:2024/05/21 13:32

http://acm.hdu.edu.cn/showproblem.php?pid=1728


#include <iostream>#include<cstdio>#include<queue>#include<cstring>using namespace std;/*刚开始就DFS,果断TLE了,不会剪枝,其实也不知道怎样BFS,百度了一下,我擦,恍然大悟,一条道走到黑呗,注意vis[][]的更新*/const int N=100;int m,n,vis[N][N];char maze[N][N];int x1,x2,y1,y2,d;int next[4][2]={0,1,1,0,-1,0,0,-1};int ok(int x,int y){    if(x<0||x>=m||y<0||y>=n||maze[x][y]=='*')        return 0;    return 1;}struct node{    int x,y;};bool bfs(int x,int y){    if(x==x2&&y==y2)        return 1;    int uk;    node p,pp;    p.x=x;    p.y=y;    queue<node> que;    que.push(p);    while(!que.empty())    {        p=que.front();        que.pop();        uk=vis[p.x][p.y];        for(int i=0;i<4;++i)        {            pp.x=p.x+next[i][0];            pp.y=p.y+next[i][1];            while(ok(pp.x,pp.y))//朝一个方向一直走下去            {                if(vis[pp.x][pp.y]==-1)//更新vis[][]数组                {                    vis[pp.x][pp.y]=uk+1;                    if(pp.x==x2&&pp.y==y2&&uk<=d)                        return 1;                    que.push(pp);                }                pp.x+=next[i][0];                pp.y+=next[i][1];            }        }    }    return 0;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&m,&n);        int i,j;        memset(vis,0,sizeof(vis));        for(i=0;i<m;++i)        {            scanf("%s",maze[i]);            for(j=0;j<n;++j)                vis[i][j]=-1;        }        scanf("%d%d%d%d%d",&d,&y1,&x1,&y2,&x2);        x1--;        y1--;        x2--;        y2--;        vis[x1][y1]=0;        printf(bfs(x1,y1)?"yes\n":"no\n");    }    return 0;}


原创粉丝点击