修道士和野人問題

2021-09-24 13:57:54 字數 1912 閱讀 7967

設在河的一岸有三個野人、三個修道士和一條船,修道士想用這條船把所有的人運到河對岸,但受以下條件的約束:

一是修道士和野人都會划船,但每次船上至多可載兩個人;

二是在河的任一岸,如果野人數目超過修道士數,修道士會被野人吃掉。

如果野人會服從任何一次過河安排,請規劃乙個確保修道士和野人都能過河,且沒有修道士被野人吃掉的安全過河計畫。

#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...