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

时间:2022-01-13 07:07:02

题目

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

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

#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=;
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+; if(temp.x>t)
{
rear.x=temp.x-;
if(rear.x>=&&rear.x<=MAXN&&!vis[rear.x])
q.push(rear),vis[rear.x]=true;
}
else
{
rear.x=temp.x+;
if(rear.x>=&&rear.x<=MAXN&&!vis[rear.x])
q.push(rear),vis[rear.x]=true; rear.x=temp.x-;
if(rear.x>=&&rear.x<=MAXN&&!vis[rear.x])
q.push(rear),vis[rear.x]=true; rear.x=temp.x*;
if(rear.x>=&&rear.x<=MAXN&&!vis[rear.x])
{
q.push(rear);
vis[rear.x]=true;
}
}
}
return ;
} int main()
{
while(scanf("%d%d",&s,&t)!=EOF)
{
if(s>t)
printf("%d\n",s-t);
else
{
printf("%d\n",bfs());
}
}
return ;
}