四個礦工必須通過一條隧道。他們只有一盞提燈,隧道一次只能通過兩人,而在通過隧道時必須提著提燈。他們不能在隧道裡停下。乙個礦工能用一分鐘通過隧道,而其他人分別需要2、4和8分鐘。當兩個礦工一起通過時,只能按比較慢的礦工的速度前行。請問如何讓四個礦工在15分鐘內全部通過?請解釋你的解決方案。
一看這樣的題目,就是深度搜尋加剪枝。
c++**(為了更直觀,都放在乙個檔案裡,實際中應該分頭檔案和原始檔)
#include
#include
#include
#include
#include
using namespace std;
const
int maxtotaltime =15;
//總共耗時限制
struct minersstate
;//1, 2, 4, 8分別表示4個礦工的耗時
bool blocal = true;
//true表示在本地,false表示去了對面
int lasttime =0;
//初始為0,這個變數表示需要的時間
//最終狀態,全部為負表示都去了對面
bool isfinalstate()
return false;
}//列印當前位置
void
printstates()
cout <<
"]";
if(blocal)
else
}//是否是相同位置(包括礦工和燈的位置)
bool issamestate
(const minersstate& state)
const
return false;}}
;void
searchstate
(deque
& states)
;void
printresult
(deque
& states)
intcaltotaltime
(deque
& states)
return sum;
}bool iscurrentactionvalid
(deque
& states, minersstate& next,
int pos0,
int pos1)}}
if((pos0 >=
0&& pos0 <=3)
&&(pos1 >=
0&& pos1 <=3)
)}}//燈在這邊,所有礦工卻都在對面,這種情況不允許發生(多慮了)if(
(next.blocal && next.miners[0]
<
0&& next.miners[1]
<
0&& next.miners[2]
<
0&& next.miners[3]
<0)
||(!next.blocal && next.miners[0]
>
0&& next.miners[1]
>
0&& next.miners[2]
>
0&& next.miners[3]
>0)
)return false;
}bool issamebucketstate
(minersstate state1, minersstate state2)
//是否已經處理過?
bool isprocessedstate
(deque
& states,
const minersstate& newstate)
void
searchstateonaction
(deque
& states, minersstate& current,
int pos0,
int pos1)
if(pos0 >=
0&& pos0 <=3)
if(pos1 >=
0&& pos1 <=3)
//pos0和pos1都在0~3範圍內,說明是2個礦工一起過隧道,取兩者過隧道絕對值大的,作為2者過隧道的總時間if(
(pos0 >=
0&& pos0 <=3)
&&(pos1 >=
0&& pos1 <=3)
)if(iscurrentactionvalid
(states, next, pos0, pos1))}
}void
searchstate
(deque
& states)
//2個人過去,乙個人把燈帶回來;然後兩個人過去,重複這個過程...
if(current.blocal)
//燈在這邊 }}
}else}}
}int
main()
執行結果:
解釋:有兩種方案:a:1,b:2,c:4;d:8,這四位礦工。
方案一:(1)a和b過去,耗時2分鐘
(2)a帶著燈返回,耗時1分鐘;
(3)c和d帶著燈過隧道,耗時8分鐘;
(4)b帶著燈返回,耗時2分鐘;
(5)a和b一起通過隧道,到達目的地,耗時2分鐘。
總耗時:2 + 1 + 8 + 2 + 2 = 15
方案二:(1)a和b過去,耗時2分鐘
(2)b帶著燈返回,耗時2分鐘;
(3)c和d帶著燈過隧道,耗時8分鐘;
(4)a帶著燈返回,耗時1分鐘;
(5)a和b一起通過隧道,到達目的地,耗時2分鐘。
總耗時:2 + 2 + 8 + 1 + 2 = 15
四個數列(二分求解)
小明有四個數列 a,b,c,d,每個數列都有 n 個數字。小明從每個數列中各取出乙個數,他想知道有多少種方案使得 4 個數的和為 0。ps 當乙個數列中有多個相同的數字的時候,把它們當做不同的數對待。input 第一行 n 代表數列中數字的個數 1 n 4000 接下來的 n 行中,第 i 行有四個...
關於階乘的四個JAVA演算法。
這裡有四個關於計算階乘的,難度依次提公升,全部通過測試。這應該是基本 了,與之共勉。這是利用簡單的迴圈相乘製造的階乘。public class factorial int fact 1 for int i 2 i x i return fact public static void main str...
事物的四個特性和四個隔離級別
事物是一條或者多條sql語句組成的執行序列,這個序列中的所有語句都屬於同乙個工作單元,要麼同時完成,其中如果有乙個失敗,則其他操作都要回滾。事物是乙個不可分割的資料庫邏輯工作單位,要麼全部完成,要不失敗回滾。事務執行的結果必須使資料庫從乙個一致性狀態變到另乙個一致性狀態。乙個事物的執行不能被別的併發...