• 九度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
    ", 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 
    ", 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 
    ", 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
  • 相关阅读:
    读《大道至简》第二章有感
    《大道至简》读后感
    JAVA课后作业
    大道至简第三章观后感
    JAVA作业之两数的加减乘除
    JAVA作业之动手动脑
    第一次Java实验
    大道至简第二章观后感
    大道至简第一章观后感
    Django__admin的配置
  • 原文地址:https://www.cnblogs.com/Elaine-DWL/p/6862693.html
Copyright © 2020-2023  润新知