位運算狀態壓縮 飛行員兄弟的冰箱

2021-07-10 01:40:38 字數 1207 閱讀 7254

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列上的所有把手的狀態也隨著改變。請你求出...