1. 程式人生 > >機試練習01:poj3278 —— 農夫和牛問題

機試練習01:poj3278 —— 農夫和牛問題

根節點 flag pri 隊列 代碼 net break eof tails

參考來源:https://blog.csdn.net/king_way/article/details/33305017

一、題解方法

采用BFS。

因為農夫每次移動的代價相同,而廣度優先搜索算法在權值一樣時的解即為最佳解,所以此題用廣度優先搜索算法就可以解決了。

將農夫每次的選擇看成一個三叉樹,即-1,+1,*2。農夫的初始節點為樹的根節點,然後依次訪問當前節點的三個孩子(+1,-1,*2),每訪問一個節點時將該節點放入隊列以實現廣度優先搜索。最佳解出現時跳出循環。

程序設置一個待訪問坐標隊列(實現廣搜),一個坐標是否訪問標誌和一個距離數組(每個點到農夫起點的最短距離)。

二、題解代碼

 1 #include "
stdio.h" 2 #include "stdlib.h" 3 #include "math.h" 4 #include <string.h> 5 #include <algorithm> 6 #include <iostream> 7 8 using namespace std; 9 10 int head, tail; 11 int queue[100001]; 12 int dist[100001]; 13 bool flag[100001]; 14 15 bool empty() 16 { 17 if(head == tail) 18 return
true; 19 else 20 return false; 21 } 22 23 void en_queue(int x) 24 { 25 queue[tail++] = x; 26 } 27 28 int de_queue() 29 { 30 return queue[head++]; 31 } 32 33 int main() { 34 35 int n, k; 36 scanf("%d%d", &n, &k); 37 38 int temp; 39 40 head = tail = 0
; 41 42 memset(dist, 0,sizeof(dist)); 43 memset(flag,0,sizeof(flag)); 44 memset(queue,0,sizeof(queue)); 45 46 en_queue(n); 47 flag[n] = true; 48 49 while(empty() == false) 50 { 51 n = de_queue(); 52 53 if(n == k) 54 { 55 printf("%d", dist[n]); 56 break; 57 } 58 59 temp = n+1; 60 if(flag[temp] == false && temp <= 100000) 61 { 62 flag[temp] = true; 63 dist[temp] = dist[n] + 1; 64 en_queue(temp); 65 } 66 67 temp = n-1; 68 if(flag[temp] == false && temp >= 0) 69 { 70 flag[temp] = true; 71 dist[temp] = dist[n] + 1; 72 en_queue(temp); 73 } 74 75 temp = n*2; 76 if(flag[temp] == false && temp <= 100000) 77 { 78 flag[temp] = true; 79 dist[temp] = dist[n] + 1; 80 en_queue(temp); 81 } 82 } 83 84 85 return 0; 86 }

機試練習01:poj3278 —— 農夫和牛問題