DFS 費解的開關

2021-09-25 22:19:30 字數 2220 閱讀 1105

joyoi 1266

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

3

00111

01011

10001

11010

11100

11101

11101

11110

11111

11111

01111

11111

11111

11111

11111

3

2-1

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

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

對於這個開關而言,固定了第一行,就可以推出所有了(只要第一行是0的,那麼下一行的這個位置必須點)

然後列舉出第一行的每一種情況,推出來,求最小,最後再判斷就好了

#include

#include

using

namespace std;

int b[6]

[6],n,a[6]

[6],ans;

char c;

intcheck

(int x)

//往下推

}for

(int i=

1; i<=5;

++i)if(

!b[5

][i]

)return

1e9;

return sum;

}void

dfs(

int x,

int k)

//x為到第一行的第幾個,k為開了多少個開關

a[1][x]=1

-a[1

][x]

; a[1]

[x-1]=

1-a[1]

[x-1];

a[1][x+1]

=1-a[1

][x+1]

; a[2]

[x]=

1-a[2]

[x];

dfs(x+

1,k+1)

;//按這個開關

a[1][x]=1

-a[1

][x]

; a[1]

[x-1]=

1-a[1]

[x-1];

a[1][x+1]

=1-a[1

][x+1]

; a[2]

[x]=

1-a[2]

[x];

dfs(x+

1,k)

;//不按這個開關

return;}

intmain()

dfs(1,

0);//搜

if(ans<=6)

printf

("%d\n"

,ans)

;else

printf

("-1\n");

}return0;

}

費解的開關 DFS 模擬

給出 n role presentation style position relative nn個 5 5 role presentation style position relative 5 5 5 5的開關,按下乙個開關會影響周圍4個燈和自己 開變成關,關變成開 求最少需要按多少次開關才能使...

費解的開關

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

費解的開關

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