每個把手都有兩種選擇,按/不按,總共有16個把手,因此有216=
65536
2^=65536
216=65
536種操作。那麼我們可以用16位二進位制數來表示,即從0000000000000000到1111111111111111。然後用1來表示按下,用0表示不按。
主要步驟:
#include #include #include #include using namespace std;
typedef pairpii;
const int n = 5;
char g[n][n], backup[n][n];
//棋盤是二維的,用位運算列舉是一維的,存在乙個對映關係
//get函式是求得某盞燈的編號(0~15) 也就是求出二維矩陣中的某個點所對應的一維座標
//16位二進位制有16位,從最低位到最高位是第0位~第15位
//求出二維矩陣中的某個點所對應的一維座標目的也就是想求出這個點在16位二進位制中是第幾個的二進位制位
//也就說這裡是想求出二維矩陣中(i,j)這盞燈它在16位二進位制中是在第幾個二進位制位
int get(int x, int y)
//翻轉當前這盞燈的狀態
void turn_one(int x, int y)
//翻轉(x,y)這盞燈它所在行所在列的所有燈的狀態(包括它自己也要翻轉)
void turn_all(int x, int y)
//因為翻轉(x,y)這盞燈所在行、所在列的所有燈時,(x,y)這盞燈被翻轉了兩次,就相當於沒有翻轉
//按道理它也是需要翻轉的,所以要在這裡給它翻轉一次
turn_one(x, y);
}int main()
);//當前(i,j)這盞燈被按下,則加入儲存列舉方案的陣列
turn_all(i, j);//轉變(i,j)這盞燈所在行、所在列的所以燈}}
}// 判斷所有燈泡是否全亮
bool has_closed = false;
for (int i = 0; i < 4; i++)}}
//如果燈都是亮的,看看這個答案和當前儲存的答案哪乙個需要的操作步驟最少
if (has_closed == false)
memcpy(g, backup, sizeof g); // 還原 讓g陣列還原成最初輸入的地圖
}cout << res.size() << endl; //輸出最小切換把手次數
//輸出切換狀態的把手的行號和列號 這裡要注意我們搞的二維座標是從0開始 題目輸出的是要從1開始 因此需要+1
for (auto op : res)
cout << op.first + 1 << ' ' << op.second + 1 << endl;
return 0;
}
飛行員兄弟
飛行員兄弟 這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。已知每個把手可以處於以下兩種狀態之一 開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。把手可以表示為乙個4 4的矩陣,您可以改變任何乙個位置 i,j 上把手的狀態。但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。請你求出...
飛行員兄弟
飛行員兄弟 這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。已知每個把手可以處於以下兩種狀態之一 開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。把手可以表示為乙個4 4的矩陣,您可以改變任何乙個位置 i,j 上把手的狀態。但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。請你求出...
飛行員兄弟
飛行員兄弟 這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。已知每個把手可以處於以下兩種狀態之一 開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。把手可以表示為乙個4 4的矩陣,您可以改變任何乙個位置 i,j 上把手的狀態。但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。請你求出...