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));
	}	
}

 

posted @ 2018-08-03 10:02  Frontierone  阅读(88)  评论(0编辑  收藏  举报