給出
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的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字...