hdu 2717&&pku3278 Catch That Cow

来源:互联网 发布:知乎怎么提问提交不了 编辑:程序博客网 时间:2024/05/18 00:02

题意:农夫找丢失的牛,x->x-1,x->x+1,x->2*x三种走法,牛不动,求最短的时间找到牛,用bfs。

#include<iostream>
#include<queue>
using namespace std;
#define size 100005
int tag[size];
void bfs(int n,int k)
{  
    if(n==k)
    {
       cout<<tag[n]<<endl;
       return;
    }
    int i;
    queue<int>que;
    memset(tag,0,sizeof(tag));
    que.push(n);
    tag[n]=0;
   
    while(!que.empty())
    {
       i=que.front();que.pop();
       if(i==k)
       {
         cout<<tag[k]<<endl;
         break;
       }
       if(i+1<=100000&&tag[i+1]==0)
       {
         tag[i+1]=tag[i]+1;
         que.push(i+1);
       }
       if(i-1>=0&&tag[i-1]==0)
       {
         tag[i-1]=tag[i]+1;
         que.push(i-1);
       }
       if(2*i<=100000&&tag[2*i]==0)
       {
         tag[2*i]=tag[i]+1;
         que.push(2*i);
       }
       int m=que.front();
     
      
      
    }
   
    return ;
}
int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        bfs(n,k);
    }
     return 0;
}
//刚刚又写了一个,呵呵,其实差不多,就是想练练手。。在杭电都是31ms

#include<iostream>
#include<queue>
using namespace std;
#define size 100005
bool tag[size];
typedef struct
{
        int x;
        int step;
}Node;
void bfs(int n,int k)
{
     int step,x,ans=0;
     if(n==k)
     {
       cout<<"0"<<endl;
       return;
     }
     Node cur,next;
     queue<Node>que;
     cur.x=n;
     cur.step=0;
     memset(tag,0,sizeof(tag));
     tag[n]=1;
     que.push(cur);
     while(!tag[k])
     {
        cur=que.front();
        que.pop();
        x=cur.x;
        step=cur.step;
        if(x-1>=0&&tag[x-1]==0)
        {
           tag[x-1]=1;
           cur.x=x-1;
           cur.step=step+1;
           que.push(cur);
           if(cur.x==k)
           {
              ans=step+1;
              break;
           }
        }
        if(x+1<=100000&&tag[x+1]==0)
        {
           tag[x+1]=1;
           cur.x=x+1;
           cur.step=step+1;
           que.push(cur);
           if(cur.x==k)
           {
              ans=step+1;
              break;
           }
        }
        if(x*2<=100000&&tag[2*x]==0)
        {
           tag[x*2]=1;
           cur.x=2*x;
           cur.step=step+1;
           que.push(cur);
           if(cur.x==k)
           {
              ans=step+1;
              break;
           }
        }
     }
     cout<<ans<<endl;
}    
int main()
{
    int n,k;
    while(scanf("%d%d",&n,&k)!=EOF)
    {
        bfs(n,k);
    }
    return 0;
}

原创粉丝点击