Ⅰ 三个商人过河数学建模图解
先过一个商人和一个仆人,然后商人架船过来,再带一个仆人过去,然后再回来,再带一个商人过去,然后让对岸的一个仆人过来带一个商人,最后仆人再返回来,把剩下的仆人带去.
Ⅱ 在数学建模中商人过河问题如果是各四人应该怎样解
商人 A,B,C,D
随从 a,b,c,d
Aa 渡河,A 回来
Ab 渡河,A 回来
AB 渡河,b 回来
bc 渡河,c 回来
Cc 渡河,c 回来
Dc 渡河,D 回来
Dd 渡河
Ⅲ 一道数学建模题 有四个商人各带一个随从过河
哈,这个问题用逆向分析好一点。就是,假如想让商人全活下来,最后一艘船运的只能是三个随从,四个商人一个随从在对岸。再进一步分析,倒数第二艘船只能是三个商人,此时一个商人一个随从在对岸,三个随从在出发点。那么到此处就不难推出第一艘船运输的是一个商人一个随从了。
故运输的顺序:一个商人一个随从先过→三个商人过→三个随从过。
Ⅳ 数学模型 4个商人,4个随从,一只小船最多容纳3人,如何安排渡船
第一步,三个仆人过,留两个仆人
第二步,两个仆人过,留一个仆人
第三步,三个商人过,留两个商人,一个仆人和一个商人回
第四步,两个商人和一个仆人过,一个仆人回
第五步,两个仆人过
Ⅳ 三个商人 三个仆人过河
综述如下:
设商人为A、B、C、所带仆人分别为a、b、c。
渡河过程:
1、商人A带着随从a渡河。
2、A将船划回来。
3、b、c两名随从接着划船渡河。
4、c将船划回来。
5、A、B两名商人划船渡河。
6、B、B主仆二人划船回来。
7、B、C两名商人划船渡河。
8、仆人a划船回来。
9、仆人a、b划船渡河。
10、商人C划船回来。
11、商人C带随从c划船渡河。
至此渡河完毕!
培养数学兴趣:重新认识数学
摆脱以往对数学复杂、枯燥的刻板印象,我们重新认识一下数学。提起数学,很多人会先想到加减乘除的运算、难以记忆的公式,其实这只是数学的一小部分,数学宇宙远比我们想象的更为广阔。
从宏观上的经济原理,到微观上的DNA双螺旋结构;从美术作品中的人体比例,到地图中海岸线的描绘;从毛衣的编织图案,到扑克牌游戏的规则……万物皆蕴含数学原理,如果我们把它局限于一门课程,往往会错过数学的美。
Ⅵ 数学建模 商人过河,四名商人各带一名随从,乘船渡河。
渡河问题我是做的不少了,不过经我分析。。。你这题目出错了 类似的渡河题目应是3个商人+3个随从 有法可解。因为1船2个人,情况都被定死的。
1、2随从去,1随从回
2、2随从去,1随从回
3、2商人去,1随从+1商人回
4、2商人去,1随从回
5、2随从去,1随从回
6、2随从去,渡河成功
这是3商人+3随从的解法,而且只有这么解,当中可能细节不同,如1中可以是1随从+1商人去,1商人回。但大体就是这样的套路
Ⅶ 数学建模 商人如何安全过河的2种方法
我觉得这个题目本身就是无解的,分析如下,请仔细看完:
1.假如两名仆人先过河,一名仆人撑船回来后载一个商人过河,那么两名仆人会在河对岸把这个商人杀掉;
2.假如一名仆人和一个商人先过河:仆人撑船回来的话,那么三名仆人会杀掉这岸的两个商人;商人撑船回来的话,再载一名仆人撑船回去,还是会在河对岸被杀掉;
3.假如两名商人撑船过河,这岸的商人就会被杀掉。
如上所述,考虑到所有情况,都是无解的。
Ⅷ 商人们怎么安全过河
商人想要过河,首先要设商人为A、B、C所带随从分别为a、b、c。首先需要商人A带着随从a渡河,然后a留在对岸,然后A将船划回来。
bc两名随从接着划船渡河,c将船划回来5AB两名商人划船渡河,Bb主仆二人划船回来,BC两名商人划船渡河即可全部渡河。
商人过河的其他解析。
商人过河为一个很经常遇到的过河问题,其实对于该类问题,我们经过逻辑思考就可以得到答案。但是通过数学模型的建立,我们可以得到一个通用的解答,并且通过计算机的计算我们可以大大扩大问题的规模。
每一步,船由此岸划到彼岸或者由彼岸划回此岸,都要对船上的人员进行决策(此次渡河船上可以有几名商人和几名随从),在保证安全(两岸的随从都不比商人多)的前提下,在有限次的决策中使得所有人都到对岸去。
Ⅸ 数学模型题目关于商人过河问题的方案..
以x1代表商人1,x2代表商人2,x3代表商人3,x4代表随从1,x5代表随从2,x6代表随从3。
数组(x1,x2,x3.x4,x5,x6)代表一个顶点,每个顶点都代表一个装袋,比如xi=1表示i在左岸,xi=0代表i不在左岸,比如(1,1,1,1,1,1,1)代表都在左岸,(1,1,1,1,1,0)代表随从3不在左岸。写出所有的顶点数,剔除不合格的顶点数,如(1,0,0,1,1,1)代表一个商人在左岸,三个随从也在左岸,这样随从会杀人越货,显然是不符合要求的。写出所有的顶点后,如果一种状态可以转化为另一种状态,就在代表这两种状态的顶点画上一条线,比如(1,1,1,1,1,1,)代表初试状态,六个人都在左岸,(1,1,0,1,1,0)表示商人3和随从3渡河了不在左岸,从(1,1,1,1,1,1,)六个人都在左岸,商人3和随从3渡河了就能转化成(1,1,0,1,1,0),所以可以在两者之间画上一条线。都画过线后,问题就转化为找出一条从(1,1,1,1,1,1,)到(0,0,0,0,0,0)的路线。
Ⅹ 一道关于数学建模问题~~~~商人们怎样安全过河~~~高手们帮帮忙~~~急~~~~·
3人的可以过河,4人的没有办法。
用递归的源程序如下:
运行结果是没有解,超过3人的没有解。
开始时商人,强盗所在的河的这边设为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();
}