「飛行員兄弟」這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。
已知每個把手可以處於以下兩種狀態之一:開啟或關閉。
只有當所有把手都開啟時,冰箱才會開啟。
把手可以表示為乙個4х4的矩陣,您可以改變任何乙個位置[i,j]上把手的狀態。
但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。
請你求出開啟冰箱所需的切換把手的次數最小值是多少。
輸入格式
輸入一共包含四行,每行包含四個把手的初始狀態。
符號「 + 」表示把手處於閉合狀態,而符號「 - 」表示把手處於開啟狀態。
至少乙個手柄的初始狀態是關閉的。
輸出格式
第一行輸出乙個整數n,表示所需的最小切換把手次數。
接下來n行描述切換順序,每行輸入兩個整數,代表被切換狀態的把手的行號和列號,數字之間用空格隔開。
資料範圍
1 ≤ i,j ≤ 4
輸入樣例:
-+--
----
----
-+--
輸出樣例:
6
1 11 3
1 44 1
4 34 4
注意:如果存在多種開啟冰箱的方式,則按照優先順序整體從上到下,同行從左到右開啟。
這道題的思路: 因為矩陣的大小是4*4,也就是說矩陣中只有16個元素,可以用二進位制數來暴力列舉每乙個位置操不操作,16個位置,每個位置
有0和1兩種狀態,因此有2^16個不同的狀態序列,而每個序列需要進行對每一位依次的進行判斷,需要16次的迴圈,因此總的時間複雜度是:
o(16 * 2 ^ 16)
題目要求:如果存在多種開啟冰箱的方式,則按照優先順序整體從上到下,同行從左到右開啟。其實滿足這個條件只需要在對每個不同的16位狀態
序列進行判斷的時候,先將低四位對應第一行的,即將第16位對應第一行第一列,第15位對應第一行第二列,第14位對應第一行第三列,依次類推下去。
#include#include#include#include#includeusing namespace std;
char c[5][5];
char back[5][5]; // 進行陣列的備份
vector> pro;
vector> ans;
int min_step = 2147483647,step;
void next(int x,int y)
for (int i = 1; i < 5; ++i)
if (i != x)
if (c[x][y] == '+') c[x][y] = '-';
else if (c[x][y] == '-') c[x][y] = '+';
}int main());
step += 1;
}k = k >> 1;
cnt++;
}int flag = 1;
for (int i = 1;i < 5; ++i)
for (int j = 1; j < 5; ++j)
if (c[i][j] == '+') flag = 0;
if (flag)
pro.clear();
}cout
return 0;
}
AcWing 116 飛行員兄弟(無腦遞推)
題目 本題不適用於遞推,因為前幾個題中乙個開關可以只由乙個開關來改變它的狀態 上面的狀態可以由下面改變 如 費解的開關 但本題中上面的開關狀態可以由下面任意乙個開關改變。思維 把所有的情況都列舉出來,因為本題可以暴力,時間複雜度小於1億 vector容器的 會使執行時間多3倍 拿y總的 和自己的進行...
116 飛行員兄弟
原題鏈結 include include include include include using namespace std typedef pair int,int pii const int maxn 5 char state maxn maxn 儲存題目給出的矩陣 vector ans,t...
116 飛行員兄弟
演算法標籤 位運算 二進位制列舉 這道題目解題思路大致是,首先我們可以構造乙個16位二進位制數,然後,二進位制數的每一位代表4x4矩陣中的一位,例如1代表 1,1 2代表 1,2 3代表 1,3 4代表 1,4 5代表 2,1 既然這樣的話,那麼我們只需要列舉這個16位的二進位制數,就可以確定我們的...