1、按照转移律,由初始状态经有限n步到达第三步:模型求解。#include stdio.hstring.h#include stdlib.hiostreamusing namespace std;conio.hFILE *fp;/*设立文件指针,以便将它用于其他函数中*/struct along m,s;struct a *next;/*数组类型a:记录各种情况下船上的商人和仆人数,m:代表商人数 s:代表仆人数*/struct a *jj,head;/*head为头指针的链表单元(船上的人数的各种情况的链表)*/int n,total=0,js=0;/*total表示船上各种情况总数*/stru
2、ct aim long m1,s1,m2,s2;int n;struct aim *back,*next;/*用于建立双向的指针链表,记入符合的情况,m1,s1表示要过岸的商人数和仆人数;m2,s2表示过岸了的商人数和仆人数,n表示来回的次数*/int k1,k2;void freeit(struct aim *p)struct aim *p1=p; p1=p-back;free(p);if(p1!=NULL)p1-next=NULL;return;/*释放该单元格,并将其上的单元格的next指针还原*/int determ(struct aim *p) struct aim *p1=p;if
3、(p-s1k2)return -1;/*仆人数不能超过总仆人数*/m1k1)return -1;/*商人数不能超过总商人数*/s2/*对岸,同上*/m2s10)return -1;/*仆人数不能为负*/s2/*商人数不能为负*/m1m2m1)return -1;m2!m2)return -1;/*两岸商人数均不能小于仆人数*/while(p1!=NULL)p1=p1-if(p1-n%2=p-n%2)s1=p-s1)s2=p-s2)m1=p-m1)m2=p-m2)return -1;/*用于解决重复,算法思想:即将每次算出的链表单元与以前的相比较,若重复,则表示出现循环*/s1=0&m1=0)n
4、%2=0)return 1;else return -1;/*显然如果达到条件就说明ok了*/return 0;/*判断函数*/int sign(int n)if(n%2=0)return -1;return 1;/*符号函数*/void copyit(struct aim *p3,struct aim *p)p3-s1=p-s1;s2=p-s2;m1=p-m1;m2=p-m2;n=p-n+1;back=p;next=p3;/*复制容函数,将p中的容写入p3所指向的链表单元中*/void print(struct aim *p3)struct aim *p=p3;js+;while(p-bac
5、k)p=p-printf(n第%d种方法:n,js);fprintf(fp,int count=0;while(p) printf(%ld,%ld:%ld,%ldt,p-m1,p-s1,p-m2,p-s2);p=p-next;count+;cout一共有countn);for(i=0;icopyit(p3,p);s1-=fla-m*f;m1-=fla-s*f;s2+=fla-m2+=fla-/*运算过程,即过河过程*/j=determ(p3);/*判断,j记录判断结果*/if(j=-1)if(itotal-1)continue;elsefreeit(p3);break;int count1=0
6、;if(j=1)if(itotal-1)print(p3);count1+;continue;elseprint(p3);/coutcout1%d,count1););if(j=0)trans(p3);/*转移函数,即将人转移过河*/*n=0*/void main() struct aim *p,*p1;int j,a,e,f;struct a *flag;/*flag是用与记录头指针*/FILE*fpt;if(fpt=fopen(c:result.dat,w+)=0)cant creat itnexit(0);fp=fpt; system(cls printf(问题描述:三个商人各带一个随从
7、乘船过河,一只小船只能容纳X人,由他们自己划船。三个商人窃听到随从们密谋,在河的任意一岸上,只要随从的人数比上人多,就杀掉商人。但是如何乘船渡河的决策权在商人手里,商人们如何安排渡河计划确保自身安全? p=(struct aim *)malloc(sizeof(struct aim);back=NULL;s2=0;m2=0;n=1;/*设立初始头指针*/please input the total of people on the boardnn请输入船上的人数nscanf(,&n%dn,n);flag=&for(e=0;e=n;e+) for(f=0;f0&e+fm=e;s=f; flag-
8、next=jj; flag=jj; /*/please input the total of merchant and salvent as follow: mechant,salvent;nplease input the total of merchant and salvent as follow:%ld,%ldm1,&s1);n%ld,%ldn/*/k1=p-k2=p-trans(p);fclose(fpt);getch();第一步:三个商人,三个随从的模型求解答案为:运行后的结果为:第 1 种方案:(3,3) 到 (0,0)、(3,1) 到 (0,2)、(3,2) 到 (0,1)、(
9、3,0) 到 (0,3)、(3,1) 到 (0,2)、(1,1) 到 (2,2)、(2,2) 到 (1,1)、(0,2) 到 (3,1)、(0,3) 到 (3,0)、(0,1) 到 (3,2)、(0,2) 到 (3,1)、(0,0) 到 (3,3)第 2 种方案:(3,3) 到 (0,0)、(3,1) 到 (0,2)、(3,2) 到 (0,1)、(3,0) 到 (0,3)、(3,1) 到 (0,2)、(1,1) 到 (2,2)、(2,2) 到 (1,1)、(0,2) 到 (3,1)、(0,3) 到 (3,0)、(0,1) 到 (3,2)、(1,1) 到 (2,2)、(0,0) 到 (3,3)第
10、 3 种方案:(3,3) 到 (0,0)、(2,2) 到 (1,1)、(3,2) 到 (0,1)、(3,0) 到 (0,3)、(3,1) 到 (0,2)、(1,1) 到 (2,2)、(2,2) 到 (1,1)、(0,2) 到 (3,1)、(0,3) 到 (3,0)、(0,1) 到 (3,2)(、0,2) 到 (3,1)、(0,0) 到 (3,3)第 4 种方案:(3,3) 到 (0,0)、(2,2) 到 (1,1)、(3,2) 到 (0,1)、(3,0) 到 (0,3)、(3,1) 到 (0,2)、(1,1) 到 (2,2)、(2,2) 到 (1,1)、(0,2) 到 (3,1)、(0,3)
11、到 (3,0)、(0,1) 到 (3,2)、(1,1) 到 (2,2)(0,0) 到 (3,3)第二步:四个商人三个随从,其结果为:第1种方法:4,3:0,0 3,2:1,1 4,2:0,1 2,2:2,1 3,2:1,12,1:2,2 2,2:2,1 0,2:4,1 0,3:4,0 0,1:4,21,1:3,2 0,0:4,3 一共有12步完成第2种方法:2,2 1,0:3,3 1,1:4,3 一共有14步完成第3种方法:0,2:4,1 0,0:第4种方法:2,1 1,1:3,2 2,1:2,2 0,1:第5种方法:第6种方法:3,33,2 0,1:4,2 0,2:第7种方法:第8种方法:0
12、,1 4,0:0,3 4,1:0,2第9种方法:第10种方法:第11种方法:第12种方法:第13种方法:第14种方法:第15种方法:1,1 3,3:1,0 2,2:第16种方法:第17种方法:第18种方法:第19种方法:第20种方法:第21种方法:第22种方法:2,1 4,2:0,14,0:0,2 2,1:4,10,3:4,2 1,1:第23种方法:4,2 2,1:3,20,0:4,3 一共有16步完成第24种方法:第25种方法:第26种方法:第27种方法:第28种方法:第29种方法:0,0 4,1:0,2 4,2:0,1 3,2:1,02,2:1,1 2,1:第30种方法:第31种方法:第32种方法:第33种方法:第34种方法:1,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1