POJ 3278 BFS

Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and the cow is at a point K (0 ≤ K ≤ 100,000) on the same number line. Farmer John has two modes of transportation: walking and teleporting.

* Walking: FJ can move from any point X to the points X - 1 or X + 1 in a single minute
* Teleporting: FJ can move from any point X to the point 2 × X in a single minute.

If the cow, unaware of its pursuit, does not move at all, how long does it take for Farmer John to retrieve it?

Input
Line 1: Two space-separated integers: N and K
Output
Line 1: The least amount of time, in minutes, it takes for Farmer John to catch the fugitive cow.
Sample Input
5 17
Sample Output
 

4


之前遇到过一次,用模拟做出来了好像,学了广搜又碰到,但是很傻比的忘了n >k的情况,然后代码越改越脑残,a了也不改回来了;

#include"iostream"
#include"algorithm"
#include"cstring"
#include"queue"
using namespace std;
const int maxn=100000+10;
bool vst[maxn];
int n,k;
struct state
{
 int x;
 int step_count;
}st[maxn];
bool cheak(int x)
{
 if(!vst[x] && x <= k+1 && x-1>=0)
 {
  return 1;
 }
 return 0;
}
void bfs(state st)
{
 queue<state> q;
 state now,next;
 vst[st.x]=1;
 st.step_count=0;
 q.push(st);
 while(!q.empty())
 {
  now=q.front();
 // cout<<"x=="<<now.x<<endl;
  int a,b,c;
  a=now.x-1;
  b=now.x+1;
  c=now.x*2;
  if(cheak(a))
  {
   next.x=a;
   vst[next.x]=1;
   next.step_count=now.step_count+1;
   if(a == k)
   {
    cout<<next.step_count<<endl;
    return ;
   }
   q.push(next);
  }
  if(cheak(b))
  {
   next.x=b;
   vst[next.x]=1;
   next.step_count=now.step_count+1;
   if(b == k)
   {
    cout<<next.step_count<<endl;
    return ;
   }
   q.push(next);
  }
  if(cheak(c))
  {
   next.x=c;
   vst[next.x]=1;
   next.step_count=now.step_count+1;
   if(c == k)
   {
    cout<<next.step_count<<endl;
    return ;
   }
   q.push(next);
   
  }
 // cout<<"a="<<a<<" b="<<b<<" c="<<c<<endl;
  q.pop();
 }
}

int main()
{
 while(cin >> n >> k)
 {
  if(n >= k)
  {
   cout<<n-k<<endl;
   continue;
  }
  memset(vst,0,sizeof(vst));
  state a;
  a.x=n;
  bfs(a);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值