| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
ADSL如何秒变专线,公网IP盒子了解一下千里之行 始于足下
共有 737 人关注过本帖
标题:农夫过河C++代码
只看楼主 加入收藏
lyb661
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:18
帖 子:47
专家分:83
注 册:2018-12-12
结帖率:71.43%
  问题点数:0  回复次数:3   
农夫过河C++代码
///农夫过河C++代码
///   作者:lyb661  时间:2015年8月

/*
农夫过河问题思路:主要使用用容器,一个存储此岸,一个存储彼岸,一个存储结果(用于打印).
过河全部过程都是随机的,都由容器来选择。所以打印结果每次可能不一样,比如:
羊过-狼过-羊回-菜过-羊过 或:羊过-菜过-羊回-狼过-羊过.
这个程序是2015年做的,当时不知道发的什么疯,做出来的。现在看起来有的笨拙,有时间再简化一下。
*/
#include<vector>
#include<iostream>
#include<list>
#include<algorithm>
#include<cstdlib>
#include<ctime>
using namespace std;
void out(int a){cout<<a<<'\n';}
int main(){
    srand(time(0));
    int ar[]={1,2,3};///1=wolf狼,2=sheep羊,3=vegetable菜
    list<int>lista(ar,ar+3); ///this bank 此岸
    vector<int>vec;///hold result  保存过河结果 用于打印渡河过程例如1代表羊过河-1代表羊回来
    list<int>listb; ///another bank  彼岸

    ///step 1:over sheep

    while(lista.size()>2){
        list<int>listat(lista); ///listat=lista ///listat用来保存lista的数据
        int n=rand()%lista.size();///will 0/1/2
        int m=n;
        lista.remove(n+1);///remove 1/2/3
        if(((find(lista.begin(),lista.end(),1)!=lista.end())&&
           (find(lista.begin(),lista.end(),2)!=lista.end()))
            ||((find(lista.begin(),lista.end(),2)!=lista.end())&&
           (find(lista.begin(),lista.end(),3)!=lista.end())))
        {
            lista.swap(listat);continue;///要是剩下狼羊或羊菜就重做
        }
        else{listb.push_back(m+1);vec.push_back(m+1);}
    }

    ///step 2:over wolf or vegetable

    {
        int n=rand()%lista.size();/// will be 0 or 1  用做容器下标
        n = n==1?2:0;             /// will be 0 or 2  代表容器元素
        lista.remove(n+1);
        int m=n;
        listb.push_back(m+1);
        vec.push_back(m+1);
        /*
        or like this
        vector<int>vca(lista.begin(),lista.end());
        int n=rand()%vca.size();
        int m=vca[n];
        lista.remove(m);
        listb.push_front(m);
        vec.push_back(m);
        */
    }
    listb.sort();

    ///step 3 is sheep back
    while(listb.size()>1){
        list<int>listat(lista);
        list<int>listbt(listb);

        vector<int>vcb(listb.begin(),listb.end());
        int n=rand()%vcb.size(); ///0 or 1

        int m=vcb[n];///1,2 or 2,3
        listb.remove(m);
        lista.push_front(m);

        if(find(listb.begin(),listb.end(),2)!=listb.end())
        {
            lista.swap(listat);
            listb.swap(listbt);continue;
        }
        else
        {
            vec.push_back(-m);
        }
    }

     lista.sort();

    ///step 4:over vegetale or wolf over river
    ///step 4 is success
    while(lista.size()>1){
        list<int>listat(lista);
        list<int>listbt(listb);
        vector<int>vca(lista.begin(),lista.end()); ///向量vca临时保存lista方便下标操作
        int n=rand()%vca.size();///will be 0 or 1
        int m=vca[n];  ///1,2 or 2,3
        lista.remove(m);///remove 1 or 3
        listb.push_front(m);
       if(((find(listb.begin(),listb.end(),1)!=listb.end())&&
           (find(listb.begin(),listb.end(),2)!=listb.end()))
            ||((find(listb.begin(),listb.end(),2)!=listb.end())&&
           (find(listb.begin(),listb.end(),3)!=listb.end())))
       {                     ///彼岸也一样同时发现羊狼或者羊有菜就重做
           lista.swap(listat);
           listb.swap(listbt);continue;
       }
       else
       {
           vec.push_back(m);
       }
    }
    ///step 5:is success!
    {
        int n=rand()%lista.size();
        vector<int>vca(lista.begin(),lista.end());
        int m=vca[n];
        lista.remove(m);
        listb.push_front(m);
        vec.push_back(m);
    }
    listb.sort();
    ///out put the result:
    cout<<"lista:\n";
    for_each(lista.begin(),lista.end(),out);
    ///对顺序容器执行某项操作,如果不成功则不会改变原状态
    cout<<"listb:\n";
    for_each(listb.begin(),listb.end(),out);
    cout<<"\n over river steps:1~5 is success!!!!!\n\n";
    for(int i=0;i!=vec.size();i++)
    {
        switch(vec[i])
        {
            case 1:cout<<i+1<<":take wolf over river(狼过)\n";break;
            case -1:cout<<i+1<<":take wolf back river(狼回)\n";break;
            case 2:cout<<i+1<<":take sheep over river(羊过)\n";break;
            case -2:cout<<i+1<<":take sheep back river(羊回)\n";break;
            case 3:cout<<i+1<<":take vegetablle over river(菜过)\n";break;
            case -3:cout<<i+1<<":take vegetablle back river(菜回)\n";break;
            default:cout<<"fail\n";
        }
    }

    cin.get();
    return 0;
}


[此贴子已经被作者于2019-1-16 19:32编辑过]

搜索更多相关主题的帖子: int cout size begin end 
2019-01-13 14:03
rrc88
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2019-1-20
  得分:0 
程序代码:
#include <stdio.h>

#define islegal(a,b,c) ((a^b)&&(b^c))
#define pass(a,b,c) (a&&b&&c)

int guohe(int a, int b, int c);
void show_status(int a, int b, int c);

int main()
{
    show_status( 0, 0, 0 );
    guohe( 0, 0, 0 );

    return 0;
}

/*
a: 狼 b: 羊 c: 菜
三个均为0,1
在对岸的为1,不在对岸的为0
全1即返回
*/
int guohe(int a, int b, int c)
{
    if ( pass(a,b,c) )    return 1;
    if (!islegal(a,b,c)) {
        b = !b;
        show_status(a,b,c);
        if (!(a^b)) a = 1;
        else c = 1;
    }
    else b = 1;
    show_status(a,b,c);
    guohe(a,b,c);
}

void show_status(int a, int b, int c)
{
    printf("狼->");
    a ? printf("过河") : printf("未过河");
    printf("   羊->");
    b ? printf("过河") : printf("未过河");
    printf("   菜->");
    c ? printf("过河") : printf("未过河");
    printf("\n\n");
}

2019-01-20 11:56
小菜鸟111
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2019-1-24
  得分:0 
2019-01-24 22:08
lyb661
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:18
帖 子:47
专家分:83
注 册:2018-12-12
  得分:0 
简化思路:使用几个函数来完成重复工作,而不是在main函数直接定义代码块,以后有时间再看吧。

2019-01-26 21:09







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026287 second(s), 8 queries.
Copyright©2004-2019, BCCN.NET, All Rights Reserved