鱼C论坛

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

过河问题 求助

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

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

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

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;
}
程序死循环了 、、、、、求指导啊~~~~

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

这个考虑到了,已经用K消除了。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-6-29 17:39:21 | 显示全部楼层
asd82937121 发表于 2011-6-29 13:48
你后调用的函数写前面  有函数声明么

直接定义了,不用声明的。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-15 06:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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