就使用广度优先搜索即可
一开始的代码一直会超时,思考了以后发现是我对广度优先搜索没有完全掌握。我一开始是在对从队列取出某个位置时才将它标记为以访问,实际上当某个点加入队列以后就应该将其标记为已访问才对,否则还是会重复访问从而形成超时
#include <iostream>
#include <queue>
#include <string.h>
using namespace std;
struct point
{
int num;
int step;
point(int x,int y):num(x),step(y){};
};
int a[100002];
int main()
{
memset(a, 0, sizeof(a));
int N, K; //0=< N,K <=100000
cin >> N >> K;
queue<point> q;
point s(N, 0);
a[N] = 1;
q.push(s);
while (!q.empty())
{
point match = q.front();
q.pop();
int mma = match.num;
//a[mma] = 1; 一开始在这里标记已经搜索过的点,是错误的
int sstep = match.step;
if (mma == K)
{
cout << match.step << endl;
return 0;
}
if (mma + 1 <= 100000 && a[mma + 1] == 0)
{
q.push(point(mma + 1, sstep + 1));
a[mma + 1] = 1;
}
if (mma - 1 >= 0 && a[mma - 1] == 0)
{
q.push(point(mma - 1, sstep + 1));
a[mma - 1] = 1;
}
if (mma * 2 <= 100000 && a[mma * 2] == 0)
{
q.push(point(mma * 2, sstep + 1));
a[mma * 2] = 1;
}
}
return 0;
}