費解的開關

2022-07-10 16:42:13 字數 1648 閱讀 3361

description

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

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

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

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

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

input format

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

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

對於30%的資料,n<=5;

對於100%的資料,n<=500。

output format

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

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

sample input

3

00111

01011

10001

11010

11100

11101

11101

11110

11111

11111

01111

11111

11111

11111

11111

sample output
32-1

題解:簡單了解題意以後,我們可以運用遞推的思想,要想把所有的格仔全部點亮,其實我們只用確定第一行的燈的所有的情況,因為第一行確定以後,我們看第二行,若第一行的某個為零,則下一行的對應位置進行點

擊,改變第一行的零為一,以此類推,以第i行來改變第i+1的情況。當到第五行時,為了不改變第四行的情況,我們便不遍歷,只需將五個字元判斷是否都為1即可,否則跳出迴圈。

**如下:

#include

using namespace std;

int t;

char a[6][6],b[6][6];

int ans;

int nex[5][2]=,,,,};

void check(int x,int y)}}

//十字轉換。

int main()

for(int k=0;k<4;k++)//只需列舉四行

for(int l=0;l<5;l++)

}int tot=0;//判斷是否出現了五次

for(int j=0;j<5;j++)

memcpy(a,b,sizeof(a));//恢復其原有狀態

if(tot!=5)

continue;

ans=min(ans,num);//求最小

}if(ans>6)

cout<<"-1"<❀完結撒花❀

費解的開關

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

費解的開關

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

費解的開關

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