poj 3278 Catch That Cow (广搜,简单)

题目

以前做过,所以现在觉得很简单,需要剪枝,注意广搜的特性;

另外题目中,当人在牛的前方时,人只能后退。

#define  _CRT_SECURE_NO_WARNINGS
//这是非一般的最短路,所以广搜到的最短的路不一定是所要的路线
//所以应该把所有的路径都搜索出来,找到最短的转折数,看他是不是不大于2
//我是 用边搜索边更新当前路径的最小转弯数 来写的
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 100010
bool vis[MAXN];
int s,t;

struct tt
{
    int x,step;
};

int bfs()
{
    tt front,rear,temp;
    queue<tt>q;
    while(!q.empty())
        q.pop();
    memset(vis,false,sizeof(vis));
    front.x=s;front.step=0;
    q.push(front);
    vis[s]=true;
    while(!q.empty())
    {
        temp=q.front();
        if(temp.x==t)
            return temp.step;
        q.pop();
        rear.step=temp.step+1;
        
        if(temp.x>t)
        {
            rear.x=temp.x-1;
            if(rear.x>=0&&rear.x<=MAXN&&!vis[rear.x])
                q.push(rear),vis[rear.x]=true;
        }
        else
        {
            rear.x=temp.x+1;
            if(rear.x>=0&&rear.x<=MAXN&&!vis[rear.x])
                q.push(rear),vis[rear.x]=true;

            rear.x=temp.x-1;
            if(rear.x>=0&&rear.x<=MAXN&&!vis[rear.x])
                q.push(rear),vis[rear.x]=true;

            rear.x=temp.x*2;
            if(rear.x>=0&&rear.x<=MAXN&&!vis[rear.x])
            {
                q.push(rear);
                vis[rear.x]=true;
            }
        }
    }
    return 0;
}

int main()
{
    while(scanf("%d%d",&s,&t)!=EOF)
    {
        if(s>t)
            printf("%d
",s-t);
        else
        {
            printf("%d
",bfs());
        }
    }
    return 0;
}
View Code
一道又一道,好高兴!
原文地址:https://www.cnblogs.com/laiba2004/p/3548755.html