題目鏈結
你玩過「拉燈」遊戲嗎?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個字元。每組資料描述了乙個遊戲的初始狀態。各組資料間用乙個空行分隔。
對於30%的資料,n≤5n \leq 5n≤5;
對於100%的資料,n≤500n \leq 500n≤500。
輸出資料一共有n行,每行有乙個小於等於6的整數,它表示對於輸入資料中對應的遊戲狀態最少需要幾步才能使所有燈變亮。對於某乙個遊戲初始狀態,若6步以內無法使所有燈變亮,請輸出「-1」。
300111
01011
10001
11010
11100
11101
11101
11110
11111
11111
01111
11111
11111
11111
11111
32-1思路:1、只有25個點,每個點只有開或關兩種狀態,那麼可以用二進位制1代表開,0代表關,那麼我們就可以用乙個整數來代表這個圖的狀態了。
2、我們可以逆向出發,從每個點全開著的情況出發,bfs搜到超過6步為止。對於每乙個第一次碰到的狀態,我們記錄下到這個狀態的步數,即這個狀態的答案。
3、預處理結束後,根據給的狀態一一作答。
**:
1 #include 2view codeusing
namespace
std;
3const
int n = 6
;4 queue q;
5 map mp;
6intt;7
8 inline int filp(int stat, inti)9
1718 inline void
bfs()
1929}30
}3132int
main()
3342 cout << mp[now] - 1
<
44return0;
45 }
演算法競賽高階指南 0x02 費解的開關
因為這題是第一題 其實不是第一題 以為比較簡單,一眼暴力,256。算的時候少算了一位,以為規模是1e7,導致樣例都算很慢,慢到我以為是死迴圈。找了半天死迴圈才發現這個 其實能出結果.然後就按照普通的翻轉問題一行一行處理。惡臭,而且有一處變數名寫錯查了半個多小時。下面標出錯誤的地方 include i...
演算法競賽高階指南 0x00
快速冪模板,寫一下快速冪的原理。我們知道,乙個數 n 在二進位制 也可以是其他進製 下可以被表示為 a 1 a 2 2 1 a 3 2 2 a m 2 那麼我們可以考慮將其分拆成二進位制狀態下的每一位,然後做冪運算。這樣做的時間複雜度為 o log 2 n 實現的過程類似於倒過來的分治 當然也可以直...
演算法競賽高階指南 費解的開關
你玩過 拉燈 遊戲嗎?25盞燈排成乙個5x5的方形。每乙個燈都有乙個開關,遊戲者可以改變它的狀態。每一步,遊戲者可以改變某乙個燈的狀態。遊戲者改變乙個燈的狀態會產生連鎖反應 和這個燈上下左右相鄰的燈也要相應地改變其狀態。我們用數字 1 表示一盞開著的燈,用數字 0 表示關著的燈。下面這種狀態 101...