簡單來說,這道題目是求我們最少需要多少步可以將所有的燈都開啟,也就是將矩陣全部變為1。
對於我們開燈其實是有兩個屬性:對於乙個5*5的矩陣,我們可以把每一行看作一串二進位制數,那麼我們就可以使用二進位制來表示當前這一行的所有按開關或不按開關的組合。(1)開燈的順序是無所謂的
(2)乙個格仔最多隻需要按一次
比如:00000 : 代表該行所有位置都不開燈
00001 : 代表該行只有最後乙個位置開燈
那麼二進位制表示的範圍就是:00000 ~ 11111
,轉化成十進位制也就是0~31
因為開燈的順序是無所謂的,所以我們可以從第一行開始遍歷,首先遍歷第一行的所有的可能出現的按開關或不按開關的組合,然後遍歷第二行,第二行中,哪一列需要按開關只與它的上一行有關,也就是只與第一行有關,也就是只有當第一行的第i
列為關燈的狀態的時候,那麼我們第二行的第i
列必須按下開關,使第一行的第i
列變為開燈的狀態。
#include
#include
using namespace std;
const
int n =
510;
int n;
char g[n]
[n], backup[n]
[n];
//backup是備份陣列
void
turn
(int x ,
int y)
, dy[5]
=;for(
int i =
0; i <
5; i++)}
intmain()
}// 遍歷其他行,由於其他行是否按開關都只與上一行有關,所以只遍歷0~4行即可
for(
int i =
0; i <
4; i++)}
}// 最後只需要看最後一行是否有燈關著即可
bool dark = false;
for(
int i =
0; i <
5; i++)}
// 如果燈全部開啟if(
!dark) res =
min(res , step)
;memcpy
(g , backup ,
sizeof g)
;// 將原始陣列重新賦值回去,供第一行遍歷}if
(res >
6) res =-1
; cout << res << endl;
}return0;
}
95 費解的開關
列舉第一行所有狀態,之後再下一行對於第一行每一種狀態進行處理,如果第一行對應 的列是0則必須在下一行按下對應的列,直至迴圈到第四行位置,這時如果第五行全部為1滿足條件 否則該方案不滿足條件 include includeusing namespace std const int inf 100000...
95 費解的開關
原題鏈結 include include include include using namespace std const int maxn 6 char state maxn maxn 儲存遊戲狀態的矩陣,使用char型別方便一次輸入一行 char backup maxn maxn 用於備份遊戲...
acwing 95 費解的開關
時 空限制 1s 256mb 你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字 1 表示一盞開著的燈,用數字 0 表示...