nkoj 2223
description
有乙個叫「飛行員兄弟的冰箱」的著名智力遊戲,在遊戲中玩家需要開啟乙個冰箱。
在冰箱的門上有16個門把手,每個門把手只有兩種狀態:開啟和關閉。當所有門把手都處於開啟狀態時,冰箱才會被開啟。
16個門把手構成了乙個4x4的矩陣,當你改變座標為(x,y)的門把手的狀態時,跟它同處於x行和跟它同處於y列的門把手們的狀態都同時會被改變(開的變為關,關的變為開)。
問最少轉動幾次把手就可以開啟冰箱門?
input
輸入乙個有"+"和"-"構成的4x4的矩陣,"+"表示該把手處於關閉狀態,"-"表示該把手處於開啟狀態。
output
乙個整數,表示最小步數
如果無解,輸出"no"
sample input
-+------
----
-+--
sample output
6
分析:基本思路當然是bfs但是存在以下問題:1.怎樣儲存狀態?
2.怎樣判定是否達到目標或者該狀態已經搜尋過?
利用位運算,每乙個二進位制位代表乙個開關。那麼所有狀態都對應著乙個0~2^16-1之間的乙個整數。
vis[i]表示該狀態是否被搜尋過
**如下:
#include#include#includeusing namespace std;
int start=0;
bool vis[66666];
struct node
};queue q;
int convert(int cur,int x)
void input() }}
bool bfs()
while(!q.empty()){
node t=q.front();
q.pop();
for(int i=0;i<16;i++){ //改變每一位
int cur=convert(t.s,i);
if(!cur){ //找到解
cout<
飛行員兄弟
飛行員兄弟 這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。已知每個把手可以處於以下兩種狀態之一 開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。把手可以表示為乙個4 4的矩陣,您可以改變任何乙個位置 i,j 上把手的狀態。但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。請你求出...
飛行員兄弟
飛行員兄弟 這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。已知每個把手可以處於以下兩種狀態之一 開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。把手可以表示為乙個4 4的矩陣,您可以改變任何乙個位置 i,j 上把手的狀態。但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。請你求出...
飛行員兄弟
飛行員兄弟 這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。已知每個把手可以處於以下兩種狀態之一 開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。把手可以表示為乙個4 4的矩陣,您可以改變任何乙個位置 i,j 上把手的狀態。但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。請你求出...