当前位置: 代码迷 >> C语言 >> 过河问题
  详细解决方案

过河问题

热度:463   发布时间:2006-03-13 10:44:00.0
过河问题
本人求一个老老问题,过河问题。就是一岸有狼羊菜农夫,狼吃羊,羊吃菜,农夫在时不吃,如果一次只能带一样到对岸,
编写程序使全部都带到对岸。(谁愿意指点的话,麻烦尽量将代码写标准,最好能附上点注释,在此多谢了!!!)
搜索更多相关的解决方案: 过河  农夫  注释  附上  

----------------解决方案--------------------------------------------------------
没人来指点指点吗?
----------------解决方案--------------------------------------------------------

我想到的算法是状态转移法


----------------解决方案--------------------------------------------------------
我想要完整的代码
----------------解决方案--------------------------------------------------------

我遍了下面这段代码,但不能打印出农夫带哪样东西的顺序,只可以打印出带每样东西到对岸的情况,希望能给你启示,也希望哪位朋友可以帮我改一改下面的代码.

#include<stdio.h>
#include<string.h>
int
main(void)
{
/*分别定义四个字符串数组来存储题目中四个名字*/
char str_1[]={"Lang"};
char str_2[]={"Yang"};
char str_3[]={"Cai"};
char str_4[]={"Nongfu"};

/*定义四个变量,变量的值可以是1和0**
**1表示在原岸,0表示在对岸**********
**即1表示没有过河,0表示过了河******/

int Lang_flag;
int Yang_flag;
int Cai_flag;
int Nongfu_flag;

/*根据题目所述,农夫不在的时候,狼和羊不可以同时在,
**羊和菜不可以同时在,狼和菜可以同时存在****************
**所以采用四个循环,分在和不在两种情况******************
**再采用IF判断语句,如果农夫不在,狼在羊不在,羊在菜不在
**这几种情况必须同时为真才符合题目要求,所以用&&符号****/

for(Lang_flag=0;Lang_flag<=1;Lang_flag++)
for(Yang_flag=0;Yang_flag<=1;Yang_flag++)
for(Cai_flag=0;Cai_flag<=1;Cai_flag++)
for(Nongfu_flag=0;Nongfu_flag<=1;Nongfu_flag++)
{
if(((Lang_flag&&!Yang_flag)||(!Lang_flag&&Yang_flag))&&
((Yang_flag&&!Cai_flag)||(!Yang_flag&&Cai_flag))&&Nongfu_flag)
{
/*因为无法判断农夫要带几次过河,所以用DO循环*****
**当狼,羊,菜都不在原岸的时候表示全部过了河*****
**这种情况下跳出DO循环***************************/
do
{
/*用表达式?a:b来选择打印的内容*/
printf("%s has been taken.\n",Yang_flag?"Lang":"Yang");
printf("%s has been taken.\n",Cai_flag?"Yang":"Cai");
}while((Lang_flag||Yang_flag||Cai_flag)==0);
}
}
return 0;/*函数返回0,表示结束*/
}


----------------解决方案--------------------------------------------------------
我记得那时候上数学建模,他用了一个D开头的算法(具体的给忘了)
不过我也忘记怎么做了,
----------------解决方案--------------------------------------------------------
多谢lj_860603的帮忙啊,可是你那样只能显示出运行到最后的结果,
我运行了一下试了,结果只有Lang has been taken
Cai has been taken
Yang has been taken
Yang has been taken
也许是我的意思没表达清楚吧,就像你说的那样,用0和1来表示在还是不在,
譬如说狼羊菜用000表示,对岸对应的用111表示到了对岸,程序运行第一步的
时候应该能显示出是怎么带的,运行后应有如下显示:
111
000 (这个表示狼羊菜都在原岸)

101
010 (经过判断将羊带到对岸)

001
110 (经过判断将狼带到对岸)

011
100 (此时狼会吃羊,所以将羊带会,切注意刚带来的狼不能再带回,否则会无限循环)

010
101 (同上判断,将菜带到对岸)

000
111 (程序完成,全部带到对岸)

完整的我想最好能是这样,不应该光只有结果,要不那就太简单了,
不过在这还是很感谢 lj_860603 的帮助和启发

----------------解决方案--------------------------------------------------------
  相关解决方案