|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目:一个人带有一只羊, 一框菜和一只狼要过河, 但船上除了载一人以外, 最多每次只能再带一样东西。而当人不在场的情况下, 羊和菜在一起, 羊要吃菜, 狼和羊在一起, 狼会吃羊。问怎样安排, 人才可以安全地把三样东西都运过河去。
我的程序如下:
#include<iostream>
using namespace std;
//index: a - 狼,b-羊,c-菜,d-农夫,value:0-本岸,1-对岸
void change(int &x) //改变状态 本岸—对岸
{
if(x==0) x=1;
if(x==1) x=0;
}
bool isvoidlegal(int a,int b,int c,int d,int &k) //判断人单独移动是否合法,合法返回TRUE
{
if(k!=1){ //k记录上一步的操作,以防止死循环 k=1代表上一步为人单独移动
change(d);
if((a==b&&d!=b)||(c==b&&d!=b)) //判断移动后是否合法
return false;
else { k=1; return true;}} //如果合法,让k=1,并返回true
else return false; //如果操作和上一步相同,则非法
}
bool isalegal(int a,int b,int c,int d,int &k) //判断人和狼一起移动是否合法,合法返回TRUE
{
if(k!=2) //k=2代表人和狼一起移动
{if(d==a)
{change(d);
change(a);}
else return false;
if((a==b&&d!=b)||(c==b&&d!=b))
return false;
else {k=2; return true;}}
else return false;
}
bool isblegal(int a,int b,int c,int d,int &k) //判断人和羊一起移动是否合法,合法返回TRUE
{ if(k!=3) //k=2代表人和羊一起移动
{if(d==b)
{change(d);
change(b);}
else return false;
if((a==b&&d!=b)||(c==b&&d!=b))
return false;
else {k=3;return true;}}
else return false;
}
bool isclegal(int a,int b,int c,int d,int &k) //判断人和菜一起移动是否合法,合法返回TRUE
{ if(k!=4) //k=2代表人和菜一起移动
{if(d==c)
{change(d);
change(c);}
else return false;
if((a==b&&d!=b)||(c==b&&d!=b))
return false;
else {k=4;return true;}}
else return false;
}
void solution(int a,int b,int c,int d,int &k)
{
while((a+b+c+d) !=4) //判段问题是否解决,没解决则继续执行循环
{
if(isalegal(a,b,c,d,k))
change(d),change(a),cout <<"mdma ";
else if(isblegal(a,b,c,d,k))
change(d),change(b),cout <<"mdmb ";
else if(isclegal(a,b,c,d,k))
change(d),change(c),cout <<"mdmc ";
else if(isvoidlegal(a,b,c,d,k))
change(d),cout <<"md ";
}
}
int main()
{
int a=0,b=0,c=0,d=0,k=0; //初始化
solution(a,b,c,d,k);
return 0;
}
程序死循环了 、、、、、求指导啊~~~~
|
|