思路:广度 优先 记录路径长度 但是题目的意思好像是要记录具体路径 下次再搞吧
-
题目描述:
-
有一个农夫带一只羊、一筐菜和一只狼过河.
果没有农夫看管,则狼要吃羊,羊要吃菜.
但是船很小,只够农夫带一样东西过河。
问农夫该如何解此难题?
-
输入:
-
题目没有任何输入。
-
输出:
-
题目可能有种解决方法,求出步骤最少的解决方法,
按顺序输出农夫想把羊、菜、狼全部运过河需要哪几个步骤。
如果需要将羊带过河去则输出“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 }