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; }