1. 程式人生 > >POJ 3278 Catch That Cow(BFS+佇列)

POJ 3278 Catch That Cow(BFS+佇列)

題目連結:http://poj.org/problem?id=3278

題目大意是:給定n和k,一個代表農夫的位置,一個代表牛的位置,然後農夫有三種操作一種是步數+1,一種是步數-1,一種是步數*2,最少要幾步操作能到達牛的位置

樣例5 17 就可以通過 5 -> 4 -> 8 -> 16 > 17或者 5 -> 10 -> 9 -> 18 -> 17

很好的廣搜題~~不難

#include<iostream>
#include<queue> 
using namespace std;
const
int maxn = 100000; struct node { int pos, cost;//一個代表位置, 一個代表花費 }; int main() { queue<node> q;//定義一個佇列 int n, k, v[maxn+5] = {0};//n是農夫的位置,k是牛的位置, v是標記陣列 node s, t; cin >> n >> k; s.pos = n; s.cost = 0; q.push(s);//入隊 while(!q.empty()) { t = q.front(); q.pop(); if
(t.pos == k) { cout << t.cost << endl; break; } if(t.pos - 1 >= 0) {//-1的情況 s.pos = t.pos - 1; s.cost = t.cost + 1; if(v[s.pos] == 0) { v[s.pos] = 1; q.push(s); } } if(t.pos + 1 <= maxn) {// +1的情況 s.pos = t.pos + 1
; s.cost = t.cost + 1; if(v[s.pos] == 0) { v[s.pos] = 1; q.push(s); } } if(t.pos*2 <= maxn) { // *2的情況 s.pos = t.pos * 2; s.cost = t.cost + 1; if(v[s.pos] == 0) { v[s.pos] = 1; q.push(s); } } } }