农夫与农场主的故事

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了农夫与农场主的故事相关的知识,希望对你有一定的参考价值。

参考技术A 有一个农场主,他有一块很大的地,某天,他买了种子便播种了,种子发芽了,嫩嫩绿绿非常可爱。可是农场主不懂怎么种好这块地,可爱的幼苗已经长了虫子,变得又黄又矮,于是他请了一个农夫帮忙,叮嘱农夫好好打理,农夫告诉农场主该买农药打虫子了,农场主一直拖延没买农药;农夫说该增添肥料了,农场主说事忙,没空买。到了收成的日子,农夫到别家种地了,农场主收获一地病央央的庄稼。

九度OJ 题目1204:农夫羊菜和狼的故事

 

思路:广度 优先  记录路径长度  但是题目的意思好像是要记录具体路径  下次再搞吧

 

题目描述:

有一个农夫带一只羊、一筐菜和一只狼过河.
果没有农夫看管,则狼要吃羊,羊要吃菜.
但是船很小,只够农夫带一样东西过河。
问农夫该如何解此难题?

输入:

题目没有任何输入。

输出:

题目可能有种解决方法,求出步骤最少的解决方法,
按顺序输出农夫想把羊、菜、狼全部运过河需要哪几个步骤。
如果需要将羊带过河去则输出“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

 















以上是关于农夫与农场主的故事的主要内容,如果未能解决你的问题,请参考以下文章

指尖农夫农场种植游戏开发

人工智能化身新型农夫,垂直农场经历“科幻”转身

bzoj4624: 农场种植

别惹农夫的苍白摆渡人自创农场和五乘怎么解锁

最大子矩阵的一种实现方法

距离咨询[tarjan求lca]