一个很复杂的问题,本人自已做出来了!望大家提提意见!
本人刚学C++不久,望大家多多指教!有三个商人和三个奴隶要过河!但只有一条船!!!每次只能坐两个人!奴隶协议,奴隶不管在哪边,如果比商人多就把商人杀掉!请问商人要怎么安排过河!(可以坐两个人,也可以做一个人,记得船要来回,别过去了就不用个人划回来)……
开始的方案有三种A.商人\
和奴隶B.商人和商人C.奴隶和奴隶,先执行B方案是绝对不行的(一边奴隶大于商人)\
那么就只剩A,B方案了,实际上A,B方案都可以!我们这里是执行A方案!商人和奴隶\
过去后当然还要把个人把船划过来,用奴隶划过来商人就死了,所以就只有商人划了\
商人过来后,就只能划两个奴隶过去了!过去后再派个奴隶把船划过来,让两个商人过\
去再划过来一个商人和一个奴隶,现在对岸有商人和奴隶各一个,这边有商人和奴隶各\
两个,接着派两个商人过去,一个奴隶划过来,在过去连个奴隶,再过来一个,在过去\
两个!大家可以拿六个物品代替的试一下!
(注:“O”代表商人!“X”代表奴隶!)
#include<iostream>
#include<string>
#include<conio.h>
void up();
void down();
void execute();
void decide();
void victory();
int man=3;
int XX=0;
int businessman_up=man,businessman_down=0,slave_up=man,slave_down=0;
int &b_u=businessman_up,&b_d=businessman_down,&s_u=slave_up,&s_d=slave_down;
const string businessman="O",slave="X";
void up()
{
victory(); //判断是否完成
++XX;
if(b_u>=2&&s_d!=0){ //判断商人是否符合过河条件
b_u=b_u-2,b_d=b_d+2;
decide();
b_u=b_u+2,b_d=b_d-2;
}
if(b_u>=1&&b_d!=0){ //判断商人是否符合过河条件
b_u=b_u-1,b_d=b_d+1;
decide();
b_u=b_u+1,b_d=b_d-1;
}
if(b_u>=1&&s_u>=1){ //判断商人和奴隶是否符合过河条件
b_u=b_u-1,b_d=b_d+1,s_u=s_u-1,s_d=s_d+1;
decide();
b_u=b_u+1,b_d=b_d-1,s_u=s_u+1,s_d=s_d-1;
}
if(s_u>=1) ; //判断奴隶是否符合过河条件
if(s_u>=2&&b_d!=1){ //判断奴隶是否符合过河条件
s_u=s_u-2,s_d=s_d+2;
decide();
s_u=s_u+2,s_d=s_d-2;
}
}
void down()
{
victory();
--XX;
if(s_d>=2); //判断奴隶是否符合过河条件
if(s_d>=1){ //判断奴隶是否符合过河条件
s_u=s_u+1,s_d=s_d-1;
decide();
s_u=s_u-1,s_d=s_d+1;
}
if((b_d>=1&&s_d>=1)&&(b_d-1!=0&&s_d-1!=0)){ //判断商人和奴隶是否符合过河条件
b_u=b_u+1,b_d=b_d-1,s_u=s_u+1,s_d=s_d-1;
decide();
b_u=b_u-1,b_d=b_d+1,s_u=s_u-1,s_d=s_d+1;
}
if(b_d>=1){ //判断商人是否符合过河条件
b_u=b_u+1,b_d=b_d-1;
decide();
b_u=b_u-1,b_d=b_d+1;
}
if(b_d>=2){ //判断商人是否符合过河条件
b_u=b_u+2,b_d=b_d-2;
decide();
b_u=b_u-2,b_d=b_d+2;
}
}
void decide() //判断过河后是否符合游戏条件
{
if(b_u>=s_u&&b_d>=s_d) execute();
if(b_u==0&&b_d>=s_d) execute();
if(b_d==0&&b_u>=s_u) execute();
}
void execute() //输出
{
for(int i=0;i!=b_u;++i)
std::cout<<businessman<<" ";
for(int i=0;i!=s_u;++i)
std::cout<<slave<<" ";
std::cout<<"\n************\n";
for(int i=0;i<b_d;++i)
std::cout<<businessman<<" ";
for(int i=0;i<s_d;++i)
std::cout<<slave<<" ";
std::cout<<"\n\n";
if(XX==1)
down();
else up();
}
void victory() //判断是否完成
{
if(b_u==0&&s_u==0)
exit(0);
}
int main()
{
execute();
return 0;
}