题目
这道搜索题,写了很久,一直没过。我一直使用dfs,无论怎样限定递归条件,始终过不了(当然,本人实在菜鸡)。今天,按照《挑战程序设计》这本书写的,对于最短路径问题,采用bfs最好。虽然,我还是不能完全懂这两种搜索方式的不同之处;但是较于以前,我明白了bfs为什么可以得到最优结果。
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
#define INF 1e9
const int maxn=2e5+10;
int n, k, d[maxn];
bool judge(int x){
if(d[x]!=-1)
return false;
if(x<0 || x>1e5)
return false;
return true;
}
int bfs(){
queue<int> q;
q.push(n);
d[n]=0;
while(!q.empty()){
int top=q.front();
q.pop();
if(top==k)
break;
if(judge(top+1)){
d[top+1]=d[top]+1;
q.push(top+1);
}
if(judge(2*top)){
d[2*top]=d[top]+1;
q.push(2*top);
}
if(judge(top-1)){
d[top-1]=d[top]+1;
q.push(top-1);
}
}
return d[k];
}
int main()
{
scanf("%d%d", &n, &k);
memset(d, -1, sizeof(d));
printf("%d\n", bfs());
return 0;
}