Ⅰ 三個商人過河數學建模圖解
先過一個商人和一個僕人,然後商人架船過來,再帶一個僕人過去,然後再回來,再帶一個商人過去,然後讓對岸的一個僕人過來帶一個商人,最後僕人再返回來,把剩下的僕人帶去.
Ⅱ 在數學建模中商人過河問題如果是各四人應該怎樣解
商人 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();
}