AcWing 95 費解的開關

2021-10-03 11:53:35 字數 1636 閱讀 5901

你玩過「拉燈」遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應:和這個燈上下左右相鄰的燈也要相應地改變其狀態。

我們用數字「1」表示一盞開著的燈,用數字「0」表示關著的燈。下面這種狀態

10111

01101

10111

10000

11011

在改變了最左上角的燈的狀態後將變成:

01111

11101

10111

10000

11011

再改變它正中間的燈後狀態將變成:

01111

11001

11001

10100

11011

給定一些遊戲的初始狀態,編寫程式判斷遊戲者是否可能在6步以內使所有的燈都變亮。

輸入格式

第一行輸入正整數n,代表資料中共有n個待解決的遊戲初始狀態。

以下若干行資料分為n組,每組資料有5行,每行5個字元。每組資料描述了乙個遊戲的初始狀態。各組資料間用乙個空行分隔。

輸出格式

一共輸出n行資料,每行有乙個小於等於6的整數,它表示對於輸入資料中對應的遊戲狀態最少需要幾步才能使所有燈變亮。

對於某乙個遊戲初始狀態,若6步以內無法使所有燈變亮,則輸出「-1」。

資料範圍

011101

11101

11110

11111

11111

01111

11111

11111

11111

11111

輸出樣例:32

-1

#include

#include

using

namespace std;

const

int n=6;

char g[n]

[n],bg[n]

[n];

int dx[5]

=,dy[5]

=;void

turn

(int x,

int y)

}int

main()

}//遞推出第一行到第四行的開關狀態

for(

int i=

0;i<

4;i++

)for

(int j=

0;j<

5;j++)if

(g[i]

[j]==

'0')

//檢查最後一行是否全亮

bool s=

true

;for

(int i=

0;i<

5;i++)if

(g[4

][i]

=='0'

) s=

false;if

(s&&cnt<=6)

res=cnt;}if

(res<=6)

printf

("%d\n"

,res)

;else

printf

("-1\n");

}return0;

}

acwing 95 費解的開關

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

ACwing 95 費解的開關

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

AcWing 95 費解的開關

我們可以通過列舉第一行的每一種狀態,然後後一行的狀態只能由前面一行確定,這樣就可以找到對應的最小步數。我的acwing裡的題解 開始給我看懵了,一直不理解下面這行 for int i 0 i 5 i if op i 1 include include using namespace std char...