1. 程式人生 > >九度OJ 題目1204:農夫、羊、菜和狼的故事

九度OJ 題目1204:農夫、羊、菜和狼的故事

pla pan wol 題目 r+ ear play struct tab

思路:廣度 優先 記錄路徑長度 但是題目的意思好像是要記錄具體路徑 下次再搞吧

題目描述:

有一個農夫帶一只羊、一筐菜和一只狼過河.
果沒有農夫看管,則狼要吃羊,羊要吃菜.
但是船很小,只夠農夫帶一樣東西過河。
問農夫該如何解此難題?

輸入:

題目沒有任何輸入。

輸出:

題目可能有種解決方法,求出步驟最少的解決方法,
按順序輸出農夫想把羊、菜、狼全部運過河需要哪幾個步驟。
如果需要將羊帶過河去則輸出“sheep_go”。
如果需要將羊帶回來則輸出“sheep_come”。
如果需要將菜帶過河去則輸出“vegetable_go”。
如果需要將菜帶回來則輸出“vegetable_come”。
如果需要將狼帶過河去則輸出“wolf_go”。
如果需要將狼帶回來則輸出“wolf_come”。
如果需要空手返回則輸出“nothing_come”。
如果需要空手過河則輸出“nothing_go”。
每輸出一種方案,輸出一行“succeed”。

樣例輸入:

樣例輸出:

提示:

題目可能有多組解決方法,每種方法輸出後要再空一行。
一種方法中的多句話,每句話占一行

技術分享
 1 #include<stdio.h>
 2 struct a{
 3     int y, c, l;
 4     int ren;
 5     int sum;
 6     struct a(){};
 7     struct a(int y, int c, int l, int ren,int sum){
 8         this->y = y;
 9         this->c = c;
10         this
->l = l; 11 this->ren = ren; 12 this->sum = sum; 13 } 14 }queue[10000]; 15 int head, rear;//頭尾標記 16 void push(int y, int c, int l, int ren,int sum){ 17 struct a temp(y, c, l, ren,sum); 18 queue[rear++] = temp; 19 } 20 void pop(int *y, int *c, int *l, int *ren,int *sum){
21 *y = queue[head].y; 22 *c = queue[head].c; 23 *l = queue[head].l; 24 *ren = queue[head].ren; 25 *sum = queue[head].sum; 26 head++; 27 } 28 bool ok(struct a v){ 29 if (v.y == 0 && v.c == 0 && v.l == 0 && v.ren == 0){//左岸什麽都沒了 30 return true; 31 } 32 return false; 33 } 34 int bfs(){ 35 head = rear = 0; 36 push(1, 1, 1, 1,0);//初始狀態進隊列 37 int trans[4][3] = { 38 { 1, 0, 0 }, { 0, 1, 0 }, { 0, 0, 1 }, { 0, 0, 0 } }; 39 while (rear != head){ 40 int y, c, l, ren, sum; 41 pop(&y, &c, &l, &ren,&sum); 42 printf("sum=%d y=%d c=%d l=%d ren=%d\n", sum, y, c, l, ren); 43 struct a t(y, c, l, ren, sum); 44 if (ok(t)) return sum; 45 for (int i = 0; i < 4; i++){//三種方式過河 46 if (ren == 1){//當前船在左岸 47 int zy = y - trans[i][0]; 48 int zc = c - trans[i][1]; 49 int zl = l - trans[i][2]; 50 if (zy < 0 || zc < 0 || zl < 0) continue; 51 if ((zy == 1 && zc == 1) || (zy == 1 && zl == 1)) continue; 52 push(zy, zc, zl, 0, sum + 1); 53 printf("由 %d %d %d %d產生:%d %d %d %d \n", y, c, l, ren, zy, zc, zl, 0); 54 } 55 else{//當前船在右岸 56 int zy = y + trans[i][0]; 57 int zc = c + trans[i][1]; 58 int zl = l + trans[i][2]; 59 if (zy > 1 || zc > 1 || zl > 1) continue; 60 if ((1-zy == 1 && 1-zc == 1) || (1-zy == 1 && 1-zl == 1)) continue; 61 push(zy, zc, zl, 1, sum + 1); 62 printf("由 %d %d %d %d產生:%d %d %d %d \n", y, c, l, ren, zy, zc, zl, 1); 63 } 64 } 65 } 66 } 67 int main(){ 68 int x = bfs(); 69 printf("%d", x); 70 return 0; 71 }
View Code

九度OJ 題目1204:農夫、羊、菜和狼的故事