您的位置:首页 > 其它

hdu 1728 逃离迷宫 (BFS)

2012-12-05 21:35 387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728

给你起点位置和终点位置,让你判断能不能到达,并且拐弯数不能超过某个值。注意不要把行列搞混了。

刚开始一直WA,因为我把它当一般的bfs走迷宫了,一走到就弹出,这样只是经过的时间最短,拐弯数却不是最优的。看了别人的解题报告,才明白,既然这道题是计算拐弯数,那就把这个方向上能拐弯的都拐了,所以把运动的方向有四个点,改成一个四个方向,搜遍方向上的可达点。

/*
运动的方向不仅仅是周围的四个点,因为没求最短时间,所以避免提前结束bfs,就四个方向搜到底
*/
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
struct node
{
    int x,y,k;//k存拐弯数
};
int t,n,m,x1,x2,y1,y2,k,vis[110][110];
char map[110][110];
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
void bfs(node vs,node vd)
{
    int flag=0;
    queue<node>q;
    node vn,vw;
    vn.x=vs.x;
    vn.y=vs.y;
    vn.k=-1;//-1,不是0;
    vis[vs.x][vs.y]=1;
    q.push(vn);
    while(!q.empty())
    {
        vn=q.front();
        q.pop();
        if(vn.x==vd.x&&vn.y==vd.y&&vn.k<=k)
        {
            flag=1;break;
        }

        vw.k=vn.k+1;//因为前面搜完了一个方向,就肯定会拐弯,所以要+1,也因此起点的k初始化为-1;

        {
            int i;
            for(i=0;i<4;i++)
            {
                int a=vn.x+dx[i];
                int b=vn.y+dy[i];
                while(a>=0&&a<n&&b>=0&&b<m&&map[a][b]!='*')//搜完一个方向
                {
                    if(!vis[a][b])
                    {
                        vis[a][b]=1;
                        vw.x=a;vw.y=b;
                        q.push(vw);
                    }
                    a+=dx[i];
                    b+=dy[i];
                }
            }
        }
    }
    printf("%s\n",flag?"yes":"no");
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        node vs,vd;
        int i;
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
        scanf("%s",map[i]);
        scanf("%d%d%d%d%d",&k,&y1,&x1,&y2,&x2);//注意他说的行列和常规的想法不一样,免得自己搞混,所以我先输入的y。
        vs.x=x1-1;vs.y=y1-1;
        vd.x=x2-1;vd.y=y2-1;
        bfs(vs,vd);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: