95 費解的開關

2021-10-21 17:05:27 字數 1248 閱讀 8668

原題鏈結

#include

#include

#include

#include

using

namespace std;

const

int maxn =6;

char state[maxn]

[maxn]

;// 儲存遊戲狀態的矩陣,使用char型別方便一次輸入一行

char backup[maxn]

[maxn]

;// 用於備份遊戲狀態

int dx[5]

=;int dy[5]

=;// 抽象出單獨的函式,用於改變燈的狀態

// x, y為轉變狀態燈的座標

void

turn

(int x,

int y)

// 若座標合法則進行狀態的轉變

state[a]

[b]^=1

;// 此處為異或運算,即0-->1 || 1-->0}}

intmain()

// 首先要保證能夠考慮到第一行(通過turn操作後)所有的狀態

// 第一行一共5盞燈,共有2^5=32種狀態

// 對第一行的每種狀態進行遞推

// 注:本題影響步數的根本條件即為第一行的狀態,因為一旦第一行的狀態確定,接下來的遞推都是固定的

// 此處的for迴圈列舉的第一行的操作,即數串op為1的位置表示進行turn操作,為0的地方不進行操作

for(

int op =

0; op <

32; op++)}

// 1~4行的燈的狀態,由下一行管控

// 通過對2~5行進行操作,保證前1~4行全亮

for(

int i =

0; i <

4; i++)}

}bool flag =

true

;// 遍歷第5行,若此時仍有燈未亮,說明該方案行不通

for(

int j =

0; j <

5; j++)}

// 如果方案行得通,則比較得出較小步數

if(flag)

memcpy

(state, backup,

sizeof state);}

// 若得出方案的步數最少仍大於6,則非法

if(res >6)

cout<}return0;

}

95 費解的開關

簡單來說,這道題目是求我們最少需要多少步可以將所有的燈都開啟,也就是將矩陣全部變為1。對於我們開燈其實是有兩個屬性 1 開燈的順序是無所謂的 2 乙個格仔最多隻需要按一次 對於乙個5 5的矩陣,我們可以把每一行看作一串二進位制數,那麼我們就可以使用二進位制來表示當前這一行的所有按開關或不按開關的組合...

95 費解的開關

列舉第一行所有狀態,之後再下一行對於第一行每一種狀態進行處理,如果第一行對應 的列是0則必須在下一行按下對應的列,直至迴圈到第四行位置,這時如果第五行全部為1滿足條件 否則該方案不滿足條件 include includeusing namespace std const int inf 100000...

acwing 95 費解的開關

時 空限制 1s 256mb 你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字 1 表示一盞開著的燈,用數字 0 表示...