#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;
}
宽搜这道题我花了两天的时间写代码,只是本人比较笨,每次都wa或是re了,这道题我总共wa了11次,虽然对高手来说都只认为是没有什么好说的题,但我感觉自己把题做出来真的能学到很多东西,像宽搜一样使我对队列的知识有了更深的理解,人家都是0ms,AC的,我用了219ms,技不如人自当努力学习啊,第一个宽搜题还是要展示一下代码的嘛,呵呵
转载于:https://www.cnblogs.com/Chinese-Coder-Clarence/articles/2039287.html