数学建模作业(商人过河问题)

合集下载

游戏中的数学模型

游戏中的数学模型

Q4= 0
1 0
0
0
0
1
0
0
0
0
1 0 0
0 1 0
0 0 0
Q5=
1
0
1
0
0
Q6=
0 1
Q7=
0 0 0 1 0 0 0 1 可以证明, Dü rer空间(简称D空间)中任何一个元 素都可以用Q1,Q2,…,Q8来线性表示,但它们能 0 0 1 0 否构成D空间的一组基呢? 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 1
类似于矩阵的加法和数乘,定义魔方的加法和数乘。
易验证,D 对加法和数乘封闭,且构成一线性空间。 记 M ={所有的4×4数字方} ,则其维数为16。 而D是M的子空间,则D是有限维的线性空间。 根据线性空间的性质,如果能得到D的一组基, 则任一个Durer方均可由这组基线性表示。
Durer魔方的维数和生成集
140 110 50 70 20
160 90 60
120 130 30
a11 a12 a13 a14
b11 b12 b13 b14
A=
a21 a22 a23 a24 a31 a32 a33 a34 a41 a42 a43 a44
B=
b21 b22 b23 b24 b31 b32 b33 b34 b41 b42 b43 b44
(i)可取状态:根据题意,并非所有状态都是允许的,例如 (0,1,1,0)就是一个不可取的状态。本题中可取状态(即系 统允许的状态)可以用穷举法列出来,它们是: 人在此岸 人在对岸 (1,1,1,1) (0,0,0,0) (1,1,1,0) (0,0,0,1) (1,1,0,1) (0,0,1,0) (1,0,1,1) (0,1,0,0) (1,0,1,0) (0,1,0,1) 总共有十个可取状态,对一般情况,应找出状态为可取的充 要条件。 (ii)可取运算:状态转移需经状态运算来实现。在实际问题 中,摆一次渡即可改变现有状态。为此也引入一个四维向量 (转移向量),用它来反映摆渡情况。例如 (1,1,0,0) 表示人带狗摆渡过河。根据题意,允许使用的转移向量只能 有(1,0,0,0,)、(1,1,0,0)、(1,0,1,0)、 (1,0,0,1)四个。

商人过河模型

商人过河模型

商人过河模型商人过河摘要本文针对商人安全渡河的问题,采用多步决策的过程建立数学模型,求解得到了在随从没有杀人越货的情况下的渡河方案。

对于本题而言,在3名商人、3名随从、船的最大容量为2的情况下,首先定义了渡河前此岸的状态,并设安全渡河条件下的状态集定义为允许状态集合,接着得到渡河方案的允许决策集合,然后得到状态随渡河方案变化的规律,最后利用平面坐标分析法,并利用计算机进行了仿真,得到了一种商人安全渡河的方案。

但是,本文不仅仅是为了拼凑出一个可行方案,而是希望能找到求解这类问题的规律性,并建立数学模型,用以解决更为广泛的问题。

基于此目的,利用图解法和算法,得到最短路径的最优解。

但同时由于该算法遍历计算的节点很多,所以效率低,而且当有多个最短距离时,不能够将所有符合条件的情况逐一列出。

最后,从这类问题解得趣味性、合理性进行了深入讨论,得到了“传教士与野蛮人渡河”,“印度夫妻渡河”等问题通用的模型,并将其进行了推广。

这也是本文的一大特色。

关键词渡河问题状态集合决策集合平面坐标图解法算法一、问题提出问题: 三名商人各带一个随从过河,一只小船只能容纳两个人,随从们约定,只要在河的任何一岸,一旦随从人数多于商人人数就杀人越货,但是商人们知道了他们的约定,并且如何过河的大权掌握在商人们手中,商人们该采取怎样的策略才能安全过河呢?二、问题分析这个问题已经理想化了,所以我们无需对模型进行假设,该问题可以看作一个多步决策问题。

每一步,船由此岸划到彼岸或者由彼岸划回此岸,都要对船上的人员进行决策(此次渡河船上可以有几名商人和几名随从),在保证安全(两岸的随从都不比商人多)的前提下,在有限次的决策中使得所有人都到对岸去。

因此,我们要做的就是要确定每一步的决策,达到渡河的目标。

三、模型假设与建立记第次过河前此岸的商人数为k x , 随从数为k y ,1,2,,k m =,,0,1,2,3k k x y =定义状态:将二维向量(,)k k k S x y =定义为状态,将安全渡河状态下的状态集合定义为允许状态集合, 记为{},y |0,3; y 0, 1, 2, 31;y 0, 12;y 0, 1,2S x x x x =======()或或记第 次渡河船上的商人数为 k u ,随从数为k v .定义决策:将二维向量(,)k k k d u v = 定义为决策;允许决策集合 记作:{}(,)|+1,2D u v u v ==因为小船容量为2,所以船上人员不能超过2,而且至少要有一个人划船,由此得到上式。

商人们怎样安全过河-(附MATLAB程序完整)

商人们怎样安全过河-(附MATLAB程序完整)

商人们怎样安全过河随从们密约, 在河的任一岸, 一旦随从的人数比商人多, 就杀人越货.但是乘船渡河的方案由商人决定.商人们怎样才能安全过河?问题分析:决策~ 每一步(此岸到彼岸或彼岸到此岸)船上的人员要求~在安全的前提下(两岸的随从数不比商人多),经有限步使全体人员过河. 建立模型xk~第k次渡河前此岸的商人数 xk, yk=0,1,2,3;yk~第k次渡河前此岸的随从数 k=1,2,|....sk=(xk , yk)~过程的状态 S ~ 允许状态集合S={(x , y) x=0, y=0,1,2,3; x=3, y=0,1,2,3; x=y=1,2}uk~第k次渡船上的商人数 uk, vk=0,1,2;vk~第k次渡船上的随从数 k=1,2,.....dk=(uk , vk)~决策 D={(u , v) u+v=1, 2} ~允许决策集合~状态转移律多步决策问题求dk D(k=1,2, n), 使sk S, 并按转移律由s1=(3,3)到达 sn+1=(0,0).模型求解穷举法~ 编程上机S={(x , y) x=0, y=0,1,2,3;x=3, y=0,1,2,3;x=y=1,2}图解法状态s=(x,y) ~ 16个格点允许状态~ 10个点允许决策 ~ 移动1或2格; k奇,左下移; k偶,右上移.d1,.......,d11给出安全渡河方案评注和思考规格化方法,易于推广考虑4名商人各带一随从的情况程序%%%%%%%%%%%%%%%% 开始 %%%%%%%%%%%%%%%%%%%%%%function jueche=guoheclear allclc%%%%%%%%%%程序开始需要知道商人和仆人数;%%%%%%%%%%%%%shangren=input('输入商人数目: ');puren=input('输入仆人数目: ');rongliang=input('输入船的最大容量: ');if puren>shangrenshangren=input('输入商人数目:');puren=input('输入仆人数目:');rongliang=input('输入船的最大容量:');end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 决策生成jc=1; %决策向量放在矩阵d中,jc为插入新元素的行标初始为1;for i=0:rongliangfor j=0:rongliangif (i+j<=rongliang)&(i+j>0) % 满足条D={(u,v)|1<=u+v<=rongliang,u,v=0,1,2}d(jc,1:3)=[i,j ,1]; %生成一个决策向量立刻扩充为三维;d(jc+1,1:3)=[-i,-j,-1]; % 同时生成他的负向量;jc=jc+2; % 由于生成两个决策向量,则jc要向下移动两个;endendj=0;end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 状态数组生成kx=1; % 状态向量放在A矩阵中,生成方法同矩阵生成;for i=shangren:-1:0for j=puren:-1:0if ((i>=j)&((shangren-i)>=(puren-j)))|((i==0)|(i==shangren))% (i>=j)&((shangren-i)>=(puren-j)))|((i==0)|(i==shangren))为可以存在的状态的约束条件 A(kx,1:3)=[i,j,1]; %生成状态数组集合D `A(kx+1,1:3)=[i,j,0];kx=kx+2;endj=puren;end;%%%%%%%%%%%%%%% 将状态向量生成抽象矩阵%%%%%%%%%%%%%%%%%%%k=(1/2)*size(A,1);CX=zeros(2*k,2*k);a=size(d,1);for i=1:2*kfor j=1:ac=A(i,:)+d(j,:) ;x=find((A(:,1)==c(1))&(A(:,2)==c(2))&(A(:,3)==c(3))) ; v(i,x)=1; %x为空不会改变v值endend%%%%%%%%%%%%%%%%%%%%%%dijstra算法%%%%%%%%%%%%%%%%%%%%%%%%%%x=1; y=size(A,1);m=size(v,1);T=zeros(m,1);T=T.^-1;lmd=T;P=T;S=zeros(m,1);S(x)=1;P(x)=0; lmd(x)=0;k=x;while(1)a=find(S==0);aa=find(S==1);if size(aa,1)==mbreak;endfor j=1:size(a,1)pp=a(j,1);if v(k,pp)~=0if T(pp)>(P(k)+v(k,pp))T(pp)=(P(k)+v(k,pp));lmd(pp)=k;endendendmi=min(T(a));if mi==infbreak;d=find(T==mi);d=d(1);P(d)=mi;T(d)=inf;k=d;S(d)=1;endendif lmd(y)==infjueche='can not reach(不能过河)';return;endjueche(1)=y;g=2; h=y;while(1)if h==xbreak;endjueche(g)=lmd(h);g=g+1;h=lmd(h);endjueche=A(jueche,:);jueche(:,3)=[]; %%%%%%%%%%%%%%%%%% 程序完 %%%%%%%%%%%%%%%%%%欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习资料等等打造全网一站式需求。

猫鸡米过河数学建模

猫鸡米过河数学建模
1, 0,1, 0 0,1, 0, 0 1,1, 0, 0 0, 0,1, 0 1,1,1, 0 2 (5) 1, 0, 0,1 0,1,1,1 1, 0, 0, 0 0,1,1, 0 1, 0,1, 0 0, 0, 0, 0 1,1, 0, 0 0,1,1, 0 (7)1, 0,1, 0 1, 0, 0,1 0, 0,1,1 1, 0, 0, 0 0, 0,1, 0

可取运算:规定A与B相加时对每一分量按 二进制法则进行 (0+0=0,1+0=0+1=1,1+1=0 )。这样, 一次渡河就是一个可取状态向量与一个可 取运载向量相加,可取状态经过加法运算 仍是一个可取状态,这种运算称为可取运 算。在上述规定下,问题转化为:从初始 状态(1,1,1,1)至少经过多少次(奇数次) 可取运算才能转化为状态(0,0,0,0)。
1,0,1,0 1,0,1,1 1,1,0,0 1,1,0,1 (4) 0,0,0,1 1 1,0,0,1 1,0,0,0 1,0,0,0 1,0,0,1
(5)
1, 0,1, 0 1, 0, 0, 0 1,1, 0, 0 1,1,1, 0 (6) 0, 0,1, 0 1, 0, 0,1 1, 0,1,1 1, 0, 0, 0 1, 0,1, 0







六、 模型的Байду номын сангаас价


第7步已经出现了(0,0,0,0)状态,说明经7次运载即可,其过程为:
人, 鸡 人 人, 猫(或米)人,鸡 人, 米(或猫)人 人, 鸡

数学建模作业

数学建模作业

第一章
1“椅子能在不平的地面上放稳么”的假设条件中,将四角连线呈正方形改为长方形,其余不变,试构造模型并求解。

2 模仿商人过河问题中的状态转移模型做下面的问题:人带着猫、鸡、米过河,人不
在时猫吃鸡,鸡吃米,设计一个安全过河方案,是渡河次数尽量少。

3 新技术的推广(分别建模):(1)推广工作通过已经采用新技术的人进行,推广速度与已采用新技术的人数成正比,推广是无限的。

(2)总人数有限,推广速度会降低。

(3)在(2)的前提下考虑广告等作用。

第二章
1 五方人口分别为5117, 4400, 162, 161, 160,是分别用最大剩余法和Q值方
法分配100个席位。

2 分别建模:(1)以雇员一天的工作时间t和工资w分别为横纵坐标,画出雇员无差别曲线族(走势以及凸向)示意图,并解释为什么这样画?(2)如果雇主付计时工资,对不同的工资率(单位时间工资)画出计时工资曲线族,并讨论双方将在怎么样的曲
线上达成协议?(3)双方已达成了一个协议,若雇主想使雇员的工作时间延长,有两种方法计算工资:一是提高工资率,二是实行超时工资制(超出部分高于工资率),
试分析哪种方法对雇主有利,在什么条件下?(可通过图形分析)
3 雨滴匀速下降,空气阻力与雨滴表面积和速度平方的乘积成正比,试确定雨速和雨
滴质量的关系。

[精华版]2009数学建模作业题

[精华版]2009数学建模作业题

第1章 数学模型引论1.1 在稳定的椅子问题中,如设椅子的四脚连线呈长方形,结论如何?(稳定的椅子问题见姜启源《数学模型》第6页)1.2 在商人们安全过河问题中,若商人和随从各四人,怎样才能安全过河呢?一般地,有n 名商人带n 名随从过河,船每次能渡k 人过河,试讨论商人们能安全过河时,n 与k 应满足什么关系。

(商人们安全过河问题见姜启源《数学模型》第7页)1.3 人、狗、鸡、米均要过河,船需要人划,另外至多还能载一物,而当人不在时,狗要吃鸡,鸡要吃米。

问人、狗、鸡、米怎样过河?1.4 有3对阿拉伯夫妻过河,船至多载两人,条件是根据阿拉伯法典,任一女子不能在其丈夫不在的情况下与其他的男子在一起。

问怎样过河?1.5 如果银行存款年利率为5.5%,问如果要求到2010年本利积累为100000元,那么在1990年应在银行存入多少元?而到2000年的本利积累为多少元?1.6 某城市的Logistic 模型为2610251251N N dt dN ⨯-=,如果不考虑该市的流动人口的影响以及非正常死亡。

设该市1990年人口总数为8000000人,试求该市在未来的人口总数。

当∞→t 时发生什么情况。

1.7 假设人口增长服从这样规律:时刻t 的人口为)(t x ,最大允许人口为m x ,t 到t t ∆+时间内人口数量与)(t x x m -成正比。

试建立模型并求解,作出解的图形并与指数增长模型和阻滞增长模型的结果进行比较。

1.8 一昼夜有多少时刻互换长短针后仍表示一个时间?如何求出这些时间?1.9 你在十层楼上欲乘电梯下楼,如果你想知道需要等待的时间,请问你需要有哪些信息?如果你不愿久等,则需要爬上或爬下几个楼层?1.10 居民的用水来自一个由远处水库供水的水塔,水库的水来自降雨和流入的河流。

水库的水可以通过河床的渗透和水面的蒸发流失。

如果要你建立一个数学模型来预测任何时刻水塔的水位,你需要哪些信息?第2章 初等模型2.1 学校共1000名学生,235人住在A 宿舍,333人住在B 宿舍,432人住在C 宿舍。

《数学建模》第3讲


模型构成
xk~第k次渡河前此岸的商人数
yk~第k次渡河前此岸的随从数
xk, yk=0,1,2,3;
k=1,2,
sk=(xk , yk)~过程的状态
S ~ 允许状态集合
S={(x , y) x=0, y=0,1,2,3; x=3, y=0,1,2,3; x=y=1,2}
uk~第k次渡船上的商人数
uk, vk=0,1,2;
从状态1出发,到吸收状态3,平均转移次数:3.93次
从状态2出发,到吸收状态3,平均转移次数:3.21次 16
从状态1或状态2出发,被状态3吸收的概率均为100%
第十六页,编辑于星期五:九点 四十二分。
3.5基因遗传和近亲繁殖
背景
• 生物的外部表征由内部相应的基因决定。 • 基因分优势基因d 和劣势基因r 两种。
vk~第k次渡船上的随从数
k=1,2,
4
第四页,编辑于星期五:九点 四十二分。
dk=(uk , vk)~决策 D={(u , v) u+v=1, 2} ~允许决策集合
sk+1=sk +(-1)k dk ~状态转移律
多步决策问题 求dkD(k=1,2, n), 使skS, 并按转移
律由 s1=(3,3)到达 sn+1=(0,0).
概率转移矩阵
0.5
0.5
0.6
1
0.4
2
8
状态转移图 第八页,编辑于星期五:九点 四十二分。
已知现在,将来与过去无关(无后效性)
St+1只取决于St和pij, 与St-1, …无关
a1 (t + 1) = a1 (t) p11 + a2 (t) p21 状态转移具有 a2 (t +1) = a1(t) p12 + a2 (t) p22 无后效性

商人过河

商人们怎样安全过河摘要:四名商人各带一名随从乘船渡河,一只小船至多容纳两人,由他们自己制定,随从约定,在河的任一岸,一旦随从的人数比商人多,就杀了越货。

但是如何乘船渡河的大权掌握在商人们手中,另外,当船的的容量增大为3,最多可以有几对商人安全过河。

商人们怎么才安全渡河,那将再此文中分析过河问题。

模型主要通图表法对过河的方案进行举例,然后根据小船的容量和商人们要安全过河为前提对各种方案进行层层筛选,最终得到商人安全过河方案。

关键词:多步决策图解法商人过河一、问题重述四名商人各带一名随从乘船渡河,一只小船至多容纳俩人,由他们自己划行,随从约,在河的任一岸,一旦随从的人数比商人多,就杀了越货。

另外,当船的的容量增大为3最多可以有几对商人安全过河但是如何乘船渡河的大权掌握在商人们手中。

现在需要解决的问题如下:1.四名商人在不被随从谋杀和小船最多能为2人的情况下,商人们将如何安全过河?2.如果有m名商人m名随从,小船的容量为3时,最多可以有多少商人各带一名随从过河。

二、模型的假设1.假设过河的过程中不会发生以外事故。

2.假设当随从人数多国商人时,不会改变杀人越货计划。

3.假设所有人最终都必须到达河对岸。

三、符号说明=0,1,2,3,4…;x k~第k次渡河前此岸的商人数x k,yk~第k次渡河前此岸的随从数k=1,2,…,) ~过程的状态S ~ 允许状态集合xS={(x , y)x=0, y=0,1,2,3,..; x=m, y=0,1,2,3,..; x=y=1,2,3..}=0, 1, 2..;~第k次渡船上的商人数~第k次渡船上的随从数k=1,2,…=( , ) ~过程的决策 D ~允许决策集合D={(u , v)u+v=1, 2, ….,u, v=0, 1, 2,…}状态因决策而改变~状态转移律四、模型分析针对商人们能否安全过河问题,需要选择一种合理的过河方案,对该问题可将看为一个多步决策模型,通过对每一次过河的方案的筛选优化,最终得到商人们全部安全过河。

商人过河问题matlab程序

商人过河functionjueche=guohe%程序开始需要知道商人和仆人数;n=input(’输入商人数目:’);nn=input('输入仆人数目:’);nnn=input('输入船的最大容量:');ifnn>nn=input(''输入商人数目:');nn=input('输入仆人数目:');nnn=input(’输入船的最大容量:');end%决策生成jc=1;%决策向量放在矩阵d中,jc为插入新元素的行标初始为1;for i=0:nnnfor j=0:nnnif(i+j<=nnn)&(i+j〉0)%满足条D={(u,v)|1〈=u+v<=nnn,u,v=0,1,2}d(jc,1:3)=[i,j,1];%生成一个决策向量立刻扩充为三维;d(jc+1,1:3)=[—i,-j,-1];%同时生成他的负向量;jc=jc+2;%由于生成两个决策向量,则jc要向下移动两个;endendj=0;end%状态数组生成kx=1;%状态向量放在A矩阵中,生成方法同矩阵生成;for i=n:-1:0for j=nn:-1:0if((i>=j)&((n—i)>=(nn-j)))|((i==0)|(i==n))%(i〉=j)&((n—i)>=(nn-j)))|((i==0)|(i==n))为可以存在状态的约束条件A(kx,1:3)=[i,j,1];%生成状态数组集合D`A(kx+1,1:3)=[i,j,0];kx=kx+2;endendj=nn;end;%将状态向量生成抽象矩阵k=(1/2)*size(A,1);CX=zeros(2*k,2*k);a=size(d,1);for i=1:2*kfor j=1:ac=A(i,:)+d(j,:);x=find((A(:,1)==c(1))&(A(:,2)==c(2))&(A(:,3)==c(3)));v(i,x)=1;%x为空不会改变v值endend%dijstra算法x=1;y=size(A,1);m=size(v,1);T=zeros(m,1);T=T。

商人过河四商四仆

商人过河四商四仆公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]2012高教社杯全国大学生数学建模竞赛承诺书我们仔细阅读了中国大学生数学建模竞赛的竞赛规则.我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。

我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。

我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。

如有违反竞赛规则的行为,我们将受到严肃处理。

我们参赛选择的题号是(从A/B/C/D中选择一项填写): A 我们的参赛报名号为(如果赛区设置报名号的话): J2202 所属学校(请填写完整的全名):江西环境工程职业学院参赛队员 (打印并签名) :1. 杨松泉2. 付琪3. 付建华指导教师或指导教师组负责人 (打印并签名):教导组日期: 2012 年 8月9 日赛区评阅编号(由赛区组委会评阅前进行编号):2012高教社杯全国大学生数学建模竞赛编号专用页赛区评阅编号(由赛区组委会评阅前进行编号):全国统一编号(由赛区组委会送交全国前编号):全国评阅编号(由全国组委会评阅前进行编号):摘要本文研究的是四个商人和四个仆人从河岸的一边过到河的另一边的问题,过河的工具只有一搜小船,只能同时载两个人过河,包括划船的人,由他们自己划行。

针对商人安全渡河的问题,采用多步决策的过程,根据各量的空间几何关系,经过严格的数学公式推导。

分别建立两个模型:模型一采用穷举法,对各种过河的方案一一列举,然后根据商人们要安全过河为前提对各种进行了列举,经过层层筛选,最终求出商人安全的方案。

模型二采用图解法,利用图示表示说明该题的解法。

最后本文就此问题进行推广,当有M名商人N名随从且小船容量为K时,将会得到几种解决方案给出了说明。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数学建模作业(四)——商人过河问题
一.问题描述
有四名商人各带一名仆人过河,但船最多能载二人,商人已获得仆人的阴谋:在河的任一岸,只要仆人数超过商人数,仆人会将商人杀死并窃取财物且安排如何乘船的权力掌握在商人手中。

试为商人制定一个安全过河的方案。

二.解决方案
用递归的源程序如下:
开始时商人,强盗所在的河的这边设为0状态,另一边设为1状态(也就是船开始时的一边设为0,当船驶到对岸是设为1状态,在这两个状态时,都必须符合条件)
#include <stdlib.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==a&&pointer-> y==b&&pointer-> 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> =0&&b> =0&&a <=3&&b <=3&&c> =0&&d> =0&&c <=3&&d <=3&&a+c==3&&b+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==0&&b==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(Duhe(a-2,b,1)==1)
return 1;
if(judge(a-1,b,4-a,3-b,1))
{
if(Duhe(a-1,b,1)==1)
return 1;
}
if(judge(a,b-1,3-a,4-b,1))
{
if(Duhe(a,b-1,1)==1)
return 1;
}
else
{
Pop(0);
return 0;
}
}
if(n==1)
/*判断0状态时,商匪状态是否符合要求*/
{
if(judge(a+1,b+1,2-a,2-b,0))
{
if(Duhe(a+1,b+1,0)==1)
return 1;
}
if(judge(a,b+2,3-a,1-b,0))
{
if(Duhe(a,b+2,0)==1)
return 1;
}
if(judge(a+2,b,1-a,3-b,0))
{
if(Duhe(a+2,b,0)==1)
return 1;
}
if(judge(a+1,b,2-a,3-b,0))
{
if(Duhe(a+1,b,0)==1)
return 1;
}
if(judge(a,b+1,3-a,2-b,0))
if(Duhe(a,b+1,0)==1)
return 1;
}
else
{
Pop(1);
return 0;
}
}
return 0;
}
main()
{
link pointer;
Push(3,3,0);
Duhe(3,3,0);
pointer=PPointer1;
while(pointer!=NULL)
{
printf( "%d,%d---%d\n ",pointer-> x,pointer-> y,pointer-> state);
pointer=pointer-> next;
}
getch();
}。

相关文档
最新文档