|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
复制代码
程序死循环了 、、、、、求指导啊~~~~
|
|