設在河的一岸有三個野人、三個修道士和一條船,修道士想用這條船把所有的人運到河對岸,但受以下條件的約束:
一是修道士和野人都會划船,但每次船上至多可載兩個人;
二是在河的任一岸,如果野人數目超過修道士數,修道士會被野人吃掉。
如果野人會服從任何一次過河安排,請規劃乙個確保修道士和野人都能過河,且沒有修道士被野人吃掉的安全過河計畫。
#include #include #include #include using namespace std;
vectorvisit;
int numofchurch, numofwild, boatload; //分別表示傳教士總人數,野人總人數,船載客量
int totalanswer = 0; //解法數目
bool check(int m, int c, int flag)
else if (check(m + j, c + k, flag + 1))
} }}
int main()
#include #include #include using namespace std;
int x, y;
int k;
struct node
;vectors;
int q[500][3];
//用於存放搜尋結點,q[0]是左岸傳教士人數
//q[1]是左岸野蠻人人數,q[2]是左岸船的數目
//q[3]用於搜尋中的父親結點序號。
int ans = 0;
int op_num = 0;
int go[500][2];
int fx[500][500];
//安全狀態:左岸中,傳教士都在or都不在or傳教士人數等於野人人數
int is_safe(int state[3])
return 0;
}//是否到達目標狀態
int is_success(int state[3])
//該狀態是否已經訪問過
int vis(int state[3])
int f2(int state[3])
int find_min(int cur)
} if (min == 10000)
op = -1;
return op;
}//過河操作
int search(int cur)
int state[3];
int j;
//cout<<"第"<> n;
cout << "請輸入k:";
cin >> k;
x = y = n;
int state[3];
//初始狀態
node nd;
nd.q[0] = state[0] = q[0][0] = x;
nd.q[1] = state[1] = q[0][1] = y;
nd.q[2] = state[2] = q[0][2] = 1;
s.push_back(nd);
//初始化操作
cout << "合法的操作組有:" << endl;
for (int i = 1; i <= k; i++)
for (int j = 0; j <= i; j++)
}cout << endl;
if (!search(0))
cout << "找到的解為:" << endl;
for (int i = 0; i <= ans; i++) }
cout << "本次搜尋所花費的費用:" << ans << endl;
system("pause");
return 0;
}
C 習題 野人與修道士過河問題
河的左岸有3個野人和3個修道士以及一條小船,修道士們想用這條小船把所有的人都運到河的右岸,但又受到以下限制 1 修道士和野人都會划船,但船一次只能載2人 2 在任何岸邊,野人數不能超過修道士數,否則修道士將會被野人吃掉。假定野人願意服從任何一種過河的安排,請規劃出一種確保修道士安全的過河方案。以下是...
修道士和野人過河問題 A 演算法 人工智慧
2014 08 25 by liy 修道士和野人過河問題,一共有3個修道士和3個野人,1條船 1 船最多可乘坐2人 2 兩岸邊 野人的數量不能多於修道士的數量,否則修道士會被吃掉 解法 a 演算法,構造估價函式 include include include using namespace std ...
演算法 傳教士和野人問題
有n個傳教士和n個野人來到河邊準備渡河,河岸有一條船,每次至多可供k人乘渡。問傳教士為了安全起見,應如何規劃擺渡方案,使得任何時刻,在河的兩岸以及船上的野人數目總是不超過傳教士的數目。即求解傳教士和野人從左岸全部擺渡到右岸的過程中,任何時刻滿足m 傳教士數 c 野人數 和m c k 的擺渡方案。te...