費解的開關

2022-10-09 08:42:10 字數 1583 閱讀 6618

你玩過「拉燈」遊戲嗎?

25 盞燈排成乙個 5×5 的方形。

每乙個燈都有乙個開關,遊戲者可以改變它的狀態。

每一步,遊戲者可以改變某乙個燈的狀態。

遊戲者改變乙個燈的狀態會產生連鎖反應:和這個燈上下左右相鄰的燈也要相應地改變其狀態。

我們用數字 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#include#includeusing namespace std;

const int n = 6;

char g[n][n],backup[n][n];

int dx[5] = , dy[5] = ;

//x和y的偏移量時一一對應的

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 dark=false;//判斷一下最後一行是不是全亮

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

if(g[4][i]=='0')

if(!dark) res=min(res,step);//如果最後一行全是亮的,則更新答案

memcpy(g,backup,sizeof g);//將備份過的字元陣列賦給原陣列,以進行下一次

//列舉第一行操作對應的操作次數

}if(res>6) res=-1;

cout<}

return 0;

}

費解的開關

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

費解的開關

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

費解的開關

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