Acwing 116 飛行員兄弟

2021-10-01 07:28:50 字數 1738 閱讀 6510

「飛行員兄弟」這個遊戲,需要玩家順利的開啟乙個擁有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位的二進位制數,就可以確定我們的...