农夫过河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编辑过]