如何通過程式設計來解決農夫過河問題?

時間 2021-06-01 20:06:44

1樓:Aloys寒風

這種問題prolog比較合適,記得當時就練過這道題。

% 農夫問題求解

% 使用乙個1×4的波爾向量來表示狼,羊,菜,農夫的狀態

% 第乙個元素代表狼,第二個羊,第三個菜,第四個農夫。

% 元素等於0時表示對應的物件在彼岸,等於1時,表示對應的物件在此岸。

% 呼叫方法 across([1,1,1,1], , State).v(

0).%在彼岸v(

1).%在此岸

move

(OldState

,NewState):-

[A1,B1

,C1,D1

]=OldState,v

(A1),v

(B1),v

(C1),v

(D1),D1==1

,% 農夫在此岸[A2

,B2,C2

,D2]=

NewState,v

(A2),v

(B2),v

(C2),v

(D2),D2==0

,% 農夫在彼岸A2+

B2=\=2,

% 狼和羊不能都留在此岸B2+

C2=\=2,

% 羊和菜不能都留在此岸A1-

A2>=0,

% 狼可以在此岸也可以去彼岸B1-

B2>=0,

% 羊可以在此岸也可以去彼岸C1-

C2>=0,

% 菜可以在此岸也可以去彼岸

sum_list

(OldState

,OldSum

),% 預置函式,列表求和

sum_list

(NewState

,NewSum

),NewSum

=:=OldSum-2.

move

(OldState

,NewState):-

[A1,B1

,C1,D1

]=OldState,v

(A1),v

(B1),v

(C1),v

(D1),D1==0

,% 農夫在彼岸[A2

,B2,C2

,D2]=

NewState,v

(A2),v

(B2),v

(C2),v

(D2),D2==1

,% 農夫在此岸A2+

B2=\=0,

% 狼和羊不能都留在彼岸B2+

C2=\=0,

% 羊和菜不能都留在彼岸A1-

A2=<0,

% 狼可以在彼岸也可以來此岸B1-

B2=<0,

% 羊可以在彼岸也可以來此岸C1-

C2=<0,

% 菜可以在彼岸也可以來此岸

sum_list

(OldState

,OldSum

),sum_list

(NewState

,NewSum

),NewSum

>=OldSum+1

,NewSum

=

across([0

,0,0

,0],Visited

,Result):-

Result=[[

0,0,

0,0]].

across

(OldState

,Visited

,Result):-

move

(OldState

,NewState

),\+

member

(NewState

,Visited

),% 預置函式,判斷前者是否是後者成員

across

(NewState,[

NewState

|Visited

],NewStateResult

),Result=[

OldState

|NewStateResult

].結果:

Result = [[1,1,1,1],[1,0,1,0],[1,0,1,1],[0,0,1,0],[0,1,1,1],[0,1,0,0],[0,1,0,1],[0,0,0,0]] ? ;

Result = [[1,1,1,1],[1,0,1,0],[1,0,1,1],[1,0,0,0],[1,1,0,1],[0,1,0,0],[0,1,0,1],[0,0,0,0]] ? ;

2樓:鄭啟威

首先,有四樣「貨物」,人,狼,羊,白菜。因此在左岸,可能有16種狀態,我們可以用乙個二進位制數來表示,比如 1111b表示都在左岸,0110b 表示狼和羊在左岸。顯然當左岸為sate時,右岸為15-state(如果在船上,我們也算在右岸)。

這裡要明確狀態的意義。

下面就是構造狀態轉移矩陣。

在這一步,我們要弄清楚乙個狀態,可能變為哪些狀態。如果兩個狀態可以互相轉換,我們就將矩陣對應的位置設為1。

先考慮人不在左岸,也就是state<8的情況,下一時刻,可能有哪些狀態呢?

顯然下一時刻,必然是船從右側過來,船上有人,還可能有另外乙個在右岸的貨物。

注意我們可以只考慮左岸沒有人的狀態,因為左岸與右岸是相反的。

#define HUMAN_BIT 8

#define WOLF_BIT 4

#define SHEEP_BIT 2

#define CABBAGE_BIT 1

#define HUMAN(state) ((state) & HUMAN_BIT)

#define WOLF(state) ((state) & WOLF_BIT)

#define SHEEP(state) ((state) & SHEEP_BIT)

#define CABBAGE(state) ((state) & CABBAGE_BIT)

intmatrix[16

][16]=

;void

CreateStateTransitionMatrix()}

這實際上就是乙個圖的鄰接矩陣,每個狀態就是圖的乙個結點。我們可以畫出來看看

H表示人 W為狼 S為羊 C為白菜。均表示左岸的狀態。

比如人帶著羊過河,那麼就由 H W S C變為 W C.

但是要注意,因為狼不能和羊在一起,羊不能和白菜在一起,也就是說 0110 0011 0111以及它們的補數,是無效的狀態,是不能達到的,因此要把這些狀態去掉。

void

RemoveOneInvalidState

(int

state)}

void

RemoveInvalidState

()此時的鄰接矩陣為

現在的問題就是找一條路徑從 H W S C 到 NULL。這就是乙個圖的搜尋問題了。

3樓:陳碩

如何看待男生通過暴力解決人際交往問題?

Mandy Leung 首先,只想通過暴力解決問題的人,都是思想比較直接較真的,因為嘴皮子鬥不過別人,因而用拳頭,證明情商太低。再者,如果使用暴力是對於弱者,那就就是人品有問題了。 高頭頭 1.他們認為暴力可以解決問題 2.他們不認為溝通可以解決問題 3.雞毛蒜皮之事卻使用暴力解決是反常的 4.如何...

如何用博弈論來解決寢室衛生問題?

已登出 解決不了,但還是嘗試解決一下。假設你的室友都是懶狗且無所謂寢室是否乾淨。而你又是個正常人,不想寢室髒。那麼博弈矩陣就是這樣的 室友行為 打掃不打掃 你的行為 打掃4,40,8 不打掃8,54,1 括號中前乙個數字代表你的感覺,後乙個數字代表室友的感覺,可以看出你打掃室友不打掃的時候達到了納什...

如何用高效思考模式來解決遇到的問題?

DOGDOGDOG 我的方法比較直接,我做事之前會先想幾種方案,如果還是遇到了突發狀況的話,如下 第一步,快速想一下這個問題最糟會對我有什麼影響?第二步,我期望得到怎樣的結果 第三步,用最短的時間辦最重要的事,分清楚拿件事最急最重要,先解決了,其次一些無關緊要的在時間充分的情況下可以完成 第四步,看...