广度优先搜索与深度优先搜索是两种不同的搜索方式。比如回答从地图上的某点到另外一点是否可达,一般可以采用深搜。而问从某点到另外点的最短路径长度可以采用广度搜索,因为在有解的前提下,广度优先搜索是按层遍历的,可以保证到达解时所用的路径最短。
下面的例子是抓住那头牛的ac代码,使用了广度优先搜索的方法解题。
#include <bits/stdc++.h>
using namespace std;
#define MAX 100000
bool flag[MAX+10];
int N, K;
struct Step {
int i, d;
Step(int ii, int dd) :i(ii), d(dd) {};
};
int main() {
scanf("%d%d", &N,&K);
queue<Step> q;
q.push(Step(N, 0));
flag[N] = 1;
while (!q.empty()) {
Step s = q.front();
if (s.i == K) {
printf("%d", s.d);
break;
}
if (s.i - 1 >= 0 && !flag[s.i - 1]) {
q.push(Step(s.i - 1, s.d + 1));
flag[s.i - 1] = 1;
}
if (s.i + 1 <= MAX && !flag[s.i + 1]) {
q.push(Step(s.i + 1, s.d + 1));
flag[s.i + 1] = 1;
}
if (s.i * 2 <= MAX && !flag[s.i * 2]) {
q.push(Step(s.i * 2, s.d + 1));
flag[s.i * 2] = 1;
}
q.pop();
}
return 0;
}