hdu 1728 逃离迷宫 (BFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728


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

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


/*
运动的方向不仅仅是周围的四个点,因为没求最短时间,所以避免提前结束bfs,就四个方向搜到底
*/
#include
#include
#include
#include
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;
    queueq;
    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=0&&b



你可能感兴趣的:(ACM)