- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数学建模作业(商人过河问题)
数学建模作业(四)——商人过河问题
问题描述
有四名商人各带一名仆人过河,但船最多能载二人,商人已获得仆人的阴谋:在河的任一岸,只要仆人数超过商人数,仆人会将商人杀死并窃取财物且安排如何乘船的权力掌握在商人手中。试为商人制定一个安全过河的方案
用递归的源程序如下: 开始时商人,强盗所在的河的这边设为0状态,另一边设为1状态(也就是船开始时的一边设为0,当船驶到对岸是设为1状态,在这两个状态时,都必须符合条件)
#include struct node /*建立一个类似栈的数据结构并且可以浏览每一个数据点*/ int x; int y; int state; struct node *next;
;
typedef struct node state;
typedef state *link;
link PPointer1 NULL;
link PPointer2 NULL;
int a1,b1;
int a2,b2; /*栈中每个数据都分为0,1状态*/
void Push int a,int b,int n link newnode; newnode link malloc sizeof state ; newnode- x a; newnode- y b; newnode- state n; newnode- next NULL; if PPointer1 NULL PPointer1 newnode; PPointer2 newnode; else PPointer2- next newnode; PPointer2 newnode; void Pop /*弹栈*/ link pointer; if PPointer1 PPointer2 free PPointer1 ; PPointer1 NULL; PPointer2 NULL; pointer PPointer1; while pointer- next! PPointer2 pointer pointer- next; free PPointer2 ; PPointer2 pointer; PPointer2- next NULL; int history int a,int b,int n /*比较输入的数据和栈中是否有重复的*/ link pointer; if PPointer1 NULL return 1; else pointer PPointer1; while pointer! NULL if pointer- x apointer- y bpointer- state n return 0; pointer pointer- next; return 1; int judge int a,int b,int c,int d,int n /*判断这个状态是否可行,其中使用了history函数*/ if history a,b,n 0 return 0; if a 0b 0a 3b 3c 0d 0c 3d 3a+c 3b+d 3 switch n case 1: if a 3 Push a,b,n ; return 1; else if a 0 Push a,b,n ; return 1; else if a b Push a,b,n ; return 1; else return 0; case 0: if a 3 Push a,b,n ; return 1; else if a 0 Push a,b,n ; return 1; else if a b Push a,b,n ; return 1; else return 0; else return 0; int Duhe int a,int b,int n /*递归法解决商人渡河问题,如果这一个状态符合*/ /*则判断下一个状态,直至问题解决*/ if a 0b 0 return 1; if n 0 /*判断0状态时,商匪状态是否符合要求*/ if judge a-1,b-1,4-a,4-b,1 if Duhe a-1,b-1,1 1 return 1; if judge a,b-2,3-a,5-b,1 if Duhe a,b-2,1 1 return 1; if judge a-2,b,5-a,3-b,1 if D
文档评论(0)