費解的開關

2021-10-03 12:56:02 字數 1797 閱讀 4147

你玩過「拉燈」遊戲嗎?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」。

資料範圍

0輸入樣例:

300111

01011

10001

11010

11100

11101

11101

11110

11111

11111

01111

11111

11111

11111

11111

輸出樣例:3

2-1我們可以發現,每一行的狀態是由它的上一行來決定。所以我們需要做的是,固定它的第一行,然後列舉其餘的四行的狀態來進行操作。當列舉完以後,還需要對最後一行燈的狀態進行檢查。由於第一行也是可以操作的,每乙個燈都有按或者不按兩個選項,所以我們要列舉所有第一行能夠進行的操作,然後開始遞推,找出乙個最佳的答案即可。

#include

#include

using

namespace std;

const

int n=6;

char g[n]

[n],backup[n]

[n];

int n;

void

turn

(int x,

int y)

,dy[5]

=;for(

int i=

0;i<

5;i++)}

intmain()

}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 backup);}

if(res>

6) cout<<

"-1"

費解的開關

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

費解的開關

時間限制 1 sec 記憶體限制 128 mb 提交 狀態 題目描述 你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字...

費解的開關

規律 順序可以任意 每個格仔只能按一次 每一行的操作完全被上一行燈滅的情況來決定 include include include include using namespace std const int n 6 char g n n backup n n int dx n dy n void tu...