ACM PKU Catch That Cow 3278 http://acm.pku.edu.cn/JudgeOnline/problem?id=3278

  宽搜这道题我花了两天的时间写代码,只是本人比较笨,每次都wa或是re了,这道题我总共wa了11次,虽然对高手来说都只认为是没有什么好说的题,但我感觉自己把题做出来真的能学到很多东西,像宽搜一样使我对队列的知识有了更深的理解,人家都是0ms,AC的,我用了219ms,技不如人自当努力学习啊,第一个宽搜题还是要展示一下代码的嘛,呵呵
#include <iostream>
#include <queue>
#include <cmath>//注意到0 1这组数据不能过所以我要用到绝对值函数;
using namespace std;

int n,k;

struct Node {
int data ;
int num ;
Node(int data,int num)
{
   this->data = data;
   this->num = num;
}//初始化;
};

queue<Node>myqueue;//建立队列对象;


bool flag [999999];标志数组其实我取的较大,取200002应该就可以了;


void match (int i,int e)
{
memset (flag,0,sizeof(flag));//标志数组初始化;

while (!myqueue.empty())
   myqueue.pop();

myqueue.push (Node (i,0));//将初始值入队;

flag [i] = 1;//标记该数值已经出现过下次查找遇到该数时可以选择不入队,节省内存;

while (1)//循环不需要条件;
{
   if (flag[myqueue.front().data-1]==0)
   {
    myqueue.push (Node (myqueue.front().data-1,myqueue.front().num+1));
    flag [myqueue.front().data-1] = 1; 
    if (flag[e]==1)
    {
     cout<<myqueue.front().num+1<<endl;
     break;
    }
   }
   if (flag[myqueue.front().data+1]==0)
   {
    myqueue.push (Node (myqueue.front().data+1,myqueue.front().num+1));
    flag [myqueue.front().data+1] = 1; 
    if (flag[e]==1)
    {
     cout<<myqueue.front().num+1<<endl;
     break;
    }
   }
   if (myqueue.front().data<=100000&&flag[myqueue.front().data*2]==0)//注意是否该数超出了标志数组下表界限;
   {
    myqueue.push (Node (myqueue.front().data*2,myqueue.front().num+1));
    flag [myqueue.front().data*2] = 1; 
    if (flag[e]==1)
    {
     cout<<myqueue.front().num+1<<endl;
     break;
    }
   }
   myqueue.pop();//出队操作,对象时针对队头元素而言的;
}
}

int main ()
{
while (scanf("%d%d",&n,&k)!=EOF)
{
   while (!myqueue.empty())
    myqueue.pop();//清空上次输出结束后残留在队列中的元素;
   if (n>=k)
   {
    cout<<fabs((k-n)*1.000)<<endl;
    continue ;
   }
   match (n,k);
}
return 0;
}

posted on 2011-05-06 19:14  _Clarence  阅读(156)  评论(0编辑  收藏  举报

导航