飛行員兄弟

2021-10-01 17:52:10 字數 2108 閱讀 4275

「飛行員兄弟」這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。

已知每個把手可以處於以下兩種狀態之一:開啟或關閉。

只有當所有把手都開啟時,冰箱才會開啟。

把手可以表示為乙個4х4的矩陣,您可以改變任何乙個位置[i,j]上把手的狀態。

但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。

請你求出開啟冰箱所需的切換把手的次數最小值是多少。

輸入格式

輸入一共包含四行,每行包含四個把手的初始狀態。

符號「+」表示把手處於閉合狀態,而符號「-」表示把手處於開啟狀態。

至少乙個手柄的初始狀態是關閉的。

輸出格式

第一行輸出乙個整數n,表示所需的最小切換把手次數。

接下來n行描述切換順序,每行輸入兩個整數,代表被切換狀態的把手的行號和列號,數字之間用空格隔開。

注意:如果存在多種開啟冰箱的方式,則按照優先順序整體從上到下,同行從左到右開啟。

資料範圍

1≤i,j≤4

輸入樣例:

-+--

----

----

-+--

輸出樣例:

6

1 11 3

1 44 1

4 34 4

最終的目的是要把棋盤上所有的字元全都變成減號,因為只有2 ^16 暴力列舉即可

每一次操作後都做記錄,並且在這一組操作結束後如果成立,則存到乙個vector裡面,下次再有成立的答案出現時,進行對比,誰用的次數更少就記錄下誰,最後進行答案的輸出,**如下:

#include

#include

#include

#include

#define x first

#define y second

using

namespace std;

typedef pair<

int,

int> pii;

const

int n =5;

char g[n]

[n], backup[n]

[n];

//棋盤是二維的,用位運算列舉是一維的,存在乙個對映關係

intget

(int x,

int y)

void

turn_one

(int x,

int y)

void

turn_all

(int x,

int y)

turn_one

(x, y);}

intmain()

);turn_all

(i, j);}

//判斷是否全部的位置都是減號了

bool flag =

false

;for

(int i =

0; i <

4; i ++

)for

(int j =

0; j <

4; j ++)if

(g[i]

[j]==

'+')

//如果全是減號了,看看這個答案和當前儲存的答案哪乙個需要的操作步驟最少if(

!flag)

if(res.

empty()

|| temp.

size()

< res.

size()

) res = temp;

memcpy

(g, backup,

sizeof g);}

cout << res.

size()

<< endl;

for(pii op : res)

cout << op.x +

1<<

' '<< op.y +

1<< endl;

}

注:利用位運算來判斷哪乙個位置需要進行操作,操作的原理同費解的開關

點這裡去看看 「費解的開關」

飛行員兄弟

飛行員兄弟 這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。已知每個把手可以處於以下兩種狀態之一 開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。把手可以表示為乙個4 4的矩陣,您可以改變任何乙個位置 i,j 上把手的狀態。但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。請你求出...

飛行員兄弟

飛行員兄弟 這個遊戲,需要玩家順利的開啟乙個擁有16個把手的冰箱。已知每個把手可以處於以下兩種狀態之一 開啟或關閉。只有當所有把手都開啟時,冰箱才會開啟。把手可以表示為乙個4 4的矩陣,您可以改變任何乙個位置 i,j 上把手的狀態。但是,這也會使得第i行和第j列上的所有把手的狀態也隨著改變。請你求出...

飛行員兄弟

每個把手都有兩種選擇,按 不按,總共有16個把手,因此有216 65536 2 65536 216 65 536種操作。那麼我們可以用16位二進位制數來表示,即從0000000000000000到1111111111111111。然後用1來表示按下,用0表示不按。主要步驟 include inclu...