用递归法解决商人渡河问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
商人渡河问题是这样的:有三个商人,三个强盗,和一条船(船每次只可以载小于等于两个人)他们同在河的一边,想渡过河去,但是必须保证在河的任何一边必须保证商人的数目大于等于强盗的数目,应该怎么过这条河呢? 用递归的源程序如下: 开始时商人,强盗所在的河的这边设为0状态,另一边设为1状态(也就是船开始时的一边设为0,当船驶到对岸是设为1状态,在这两个状态时,都必须符合条件) #includestdlib.h 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) ??????????

文档评论(0)

mhk8089 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档