一農夫帶著一頭狼,乙隻羊和乙個白菜過河,小船只能一次裝載農夫和一樣貨物,狼會吃羊,羊會吃白菜,只有農夫在時才安全。現欲讓所有物品包括農夫都安全過道河對岸,求最佳答案。
用16*4的矩陣:a[16][4],存放每一步的狀態,第一列表示農夫的狀態,第二列表示菜的狀態,第三列表示羊的狀態,第四列表示狐狸的狀態,陣列a裡面的元素只為0或1,0代表在左岸,1代表在右岸。
初始狀態a[0][0]=a[0][1]=a[0][2]=a[0][3]=0,目標狀態是矩陣的某一行全為1。
農夫做往返運動,即第i步中,a[i][0] = i%2。
每次農夫過河,可以選擇帶一件貨物,也可以選擇不帶。
在農夫不在場的情況下,狼和羊不能在一起,羊和白菜不能在一起。
#include
#include
#include
#include
using
namespace
std;
void search(int i);
int a[16][4];
set s;
int b[16];
string ss[2];
string t[4];
int k;
int level;
int count1(int a)//將當前狀態轉化為10進製數
void show(int a)//顯示結果函式
else
//若不滿足條件則恢復 }}
}void bringnothing(int i)//假設農夫什麼也不帶走
else
b[i]=0;
}void search(int i)//從第i層開始搜尋判斷第i+1層可能的情況
b[i]=-1;
if(i%2==1)//在右岸,先考慮農夫什麼也不帶走
else
}int main()
s.clear();
k=0;
level=0;
s.insert(0); //先將初始狀態儲存起來
search(0); //從第0層開始搜尋
for(int i=0;i<16;i++)
return
0;}
農夫從右邊回左邊,什麼也不帶 左邊:菜 狐狸 右邊:羊
農夫從左邊去右邊,帶上菜 左邊:狐狸 右邊:菜 羊
農夫從右邊回左邊,帶上羊 左邊:羊 狐狸 右邊:菜
農夫從左邊去右邊,帶上狐狸 左邊:羊 右邊:菜 狐狸
農夫從右邊回左邊,什麼也不帶 左邊:羊 右邊:菜 狐狸
農夫從左邊去右邊,帶上羊 左邊: 右邊:菜 羊 狐狸
0 0 0 0
1 0 1 0
0 0 1 0
1 1 1 0
0 1 0 0
1 1 0 1
0 1 0 1
1 1 1 1
農夫過河問題
題目描述 有乙個農夫帶乙隻羊 一筐菜和乙隻狼過河。如果沒有農夫看管,則狼要吃羊,羊要吃菜。但是船很小,只夠農夫帶一樣東西過河。問農夫該如何解此難題?我的 include include include include include include include using namespace s...
農夫過河問題
問題 有一人帶著狼羊菜來到河的左岸欲乘乙隻小船過到右岸,每次人只能帶其中乙個過河 當有人在不會有事 當無人在時 就不允 許狼和羊在一起,也不允許羊和菜在一起,設計演算法以最少的次數過河?採用位向量,4個二進位制位的0 1情況表示狀態,顯而易見,共24 16種可能狀態。從高位到低位分別表示農夫 狼 白...
求解農夫過河問題
問題 乙個農夫帶著一匹狼 乙隻羊 一顆白菜要過河,只有一條船而且農夫每次最多只能帶乙個動物或物品過河,並且當農夫不在的時候狼會吃羊,羊會吃白菜,列出所有安全將所有動物和物品帶過河的方案。思路分析 顯然這不是乙個最優解的問題,最容易想到的方法就是遍歷了,設法用遍歷列舉出所有可能出現的情況,根據條件選取...