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

 

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

 

题目描述:

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

输入:

题目没有任何输入。

输出:

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

 

转载于:https://www.cnblogs.com/Elaine-DWL/p/6862693.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值