POJ3278 Catch That Cow
题目:http://poj.org/problem?id=3278
思路:从n到k,每步有3种走法,根本没有发现用bfs可以完美解决问题。方法非常巧。其实也是正常解法,平时做的bfs都是6或8个方向并且是2维的,但是换做3种走法还是一维的就感觉很神奇,说明没有真正理解bfs。这样一说,就更简单了。
AC代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
const int maxn = 100001;
using namespace std;
bool vis[maxn];//标记
int step[maxn];//每个点的步数
int n, k;
int bfs(int n, int k) {
step[n] = 0;//从n到k,所以step[n] = 0
vis[n] = true;//标记
queue<int> q;
q.push(n);
int head, next;
while(!q.empty()) {//和平时的bfs队列一样
head = q.front();
q.pop();
for(int i = 0; i < 3; i++) {//分别对应3种走法
if(i == 0)
next = head + 1;
else if(i == 1)
next = head * 2;
else if(i == 2)
next = head - 1;
if(next >= 0 && next < maxn) {//判断条件
if(!vis[next]) {
step[next] = step[head] + 1;//更新
vis[next] = true;//标记
q.push(next);//入队
}
}
if(next == k)//结果
return step[k];
}
}
}
int main() {
while(~scanf("%d%d", &n, &k)) {
memset(step, 0, sizeof(step));
memset(vis, false, sizeof(vis));
if(k <= n)
printf("%d\n", n-k);
else
printf("%d\n", bfs(n, k));
}
}
埋骨何须桑梓地,人生无处不青山