鱼C论坛

 找回密码
 立即注册
查看: 3377|回复: 6

过河问题 求助

[复制链接]
发表于 2011-6-29 12:41:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:一个人带有一只羊, 一框菜和一只狼要过河, 但船上除了载一人以外, 最多每次只能再带一样东西。而当人不在场的情况下, 羊和菜在一起, 羊要吃菜, 狼和羊在一起, 狼会吃羊。问怎样安排, 人才可以安全地把三样东西都运过河去。  
我的程序如下:

  1. #include<iostream>
  2. using namespace std;
  3. //index: a - 狼,b-羊,c-菜,d-农夫,value:0-本岸,1-对岸
  4. void change(int &x)  //改变状态 本岸—对岸
  5. {
  6.     if(x==0) x=1;
  7. if(x==1) x=0;
  8. }
  9. bool isvoidlegal(int a,int b,int c,int d,int &k) //判断人单独移动是否合法,合法返回TRUE
  10. {   
  11. if(k!=1){                                  //k记录上一步的操作,以防止死循环  k=1代表上一步为人单独移动
  12.   change(d);
  13.     if((a==b&&d!=b)||(c==b&&d!=b))             //判断移动后是否合法
  14.   return false;
  15. else { k=1; return true;}}                 //如果合法,让k=1,并返回true
  16. else return false;                          //如果操作和上一步相同,则非法
  17. }
  18. bool isalegal(int a,int b,int c,int d,int &k)  //判断人和狼一起移动是否合法,合法返回TRUE
  19. {  
  20. if(k!=2)                                   //k=2代表人和狼一起移动
  21. {if(d==a)
  22. {change(d);
  23.     change(a);}
  24. else return false;
  25.   if((a==b&&d!=b)||(c==b&&d!=b))
  26.   return false;
  27.   else {k=2; return true;}}
  28. else return false;
  29. }
  30. bool isblegal(int a,int b,int c,int d,int &k)  //判断人和羊一起移动是否合法,合法返回TRUE
  31. {  if(k!=3)                                    //k=2代表人和羊一起移动
  32. {if(d==b)
  33. {change(d);
  34.     change(b);}
  35. else return false;
  36.   if((a==b&&d!=b)||(c==b&&d!=b))
  37.   return false;
  38.   else {k=3;return true;}}
  39. else return false;
  40. }
  41. bool isclegal(int a,int b,int c,int d,int &k)   //判断人和菜一起移动是否合法,合法返回TRUE
  42. {  if(k!=4)                                     //k=2代表人和菜一起移动
  43. {if(d==c)
  44. {change(d);
  45.     change(c);}
  46. else return false;
  47.   if((a==b&&d!=b)||(c==b&&d!=b))
  48.   return false;
  49.   else {k=4;return true;}}
  50.   else return false;
  51. }
  52. void solution(int a,int b,int c,int d,int &k)
  53. {
  54.     while((a+b+c+d) !=4)                     //判段问题是否解决,没解决则继续执行循环
  55. {
  56.   if(isalegal(a,b,c,d,k))               
  57.    change(d),change(a),cout <<"mdma  ";
  58.   else if(isblegal(a,b,c,d,k))
  59.    change(d),change(b),cout <<"mdmb  ";
  60.   else if(isclegal(a,b,c,d,k))
  61.    change(d),change(c),cout <<"mdmc  ";
  62.   else if(isvoidlegal(a,b,c,d,k))
  63.    change(d),cout <<"md   ";
  64. }
  65. }
  66. int main()
  67. {   
  68. int a=0,b=0,c=0,d=0,k=0;         //初始化
  69. solution(a,b,c,d,k);
  70.     return 0;
  71. }
复制代码

程序死循环了 、、、、、求指导啊~~~~

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-6-29 13:02:03 | 显示全部楼层
羊过 菜过 羊回来 狼过 羊过
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-6-29 13:31:27 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
头像被屏蔽
发表于 2011-6-29 13:42:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2011-6-29 13:48:46 | 显示全部楼层
你后调用的函数写前面  有函数声明么
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-6-29 17:38:19 | 显示全部楼层
a19715 发表于 2011-6-29 13:42
if(k!=1){                                  //k记录上一步的操作,以防止死循环  k=1代表上一步为人单独移 ...

这个考虑到了,已经用K消除了。。。。。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2011-6-29 17:39:21 | 显示全部楼层
asd82937121 发表于 2011-6-29 13:48
你后调用的函数写前面  有函数声明么

直接定义了,不用声明的。。。。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 05:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表