費解的開關 DFS 模擬

2022-09-03 06:15:14 字數 2016 閱讀 5246

給出

n' role="presentation" style="position: relative">nn個

5×5' role="presentation" style="position: relative">5×5

5×5的開關,按下乙個開關會影響周圍4個燈和自己(開變成關,關變成開)。求最少需要按多少次開關才能使得全部燈變亮?(6次以上則視為無法點亮)。

這道題如果用普通的廣蒐會t。。。

這道題的正解如下:

假設我們不動第一行的開關,那麼如果要改變第一行的燈的狀態,那麼就只能更改第二行的位於該燈下面的那個開關來改變。例如:

如果我們固定了第一行,那麼為了將全部都變成綠色,就必須利用第二行。例如,(1

,1)' role="presentation" style="position: relative">(1,

1)(1

,1)是紅色,為了讓它變成綠色,就必須更改(2

,1)' role="presentation" style="position: relative">(2,

1)(2

,1)。為了讓(1

,4)' role="presentation" style="position: relative">(1,

4)(1

,4)變成綠色,就必須更改(2

,4)' role="presentation" style="position: relative">(2,

4)(2

,4)。

更改後圖形如下:

那麼我們再固定第二行,利用第三行來更改它(就像用第一行來更改第二行一樣),就變成了

同理,更改第三行

再更改第四行

這是我們發現,最後還有乙個燈是關著的,所以,這說明第一行的燈如果是這樣的情況就無法成立

那麼就列舉第一行的點選方式,再繼續按照剛才的方法,判斷能否點玩即可。

#include 

#include

#define inf 1e7

using

namespace

std;

int n,a[6][6],b[6][6],ans;

int check(int x) //判斷當第一行的情況是否成立

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

if (!b[5][i]) return inf; //判斷最後一行是否全開

return sum;

}void dfs(int x,int 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;

}int main()

return

0;}

DFS 費解的開關

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

費解的開關

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

費解的開關

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