切換
舊版
前往
大廳
主題

ZeroJudge - b002: 關燈 解題心得

Not In My Back Yard | 2019-02-22 23:49:26 | 巴幣 104 | 人氣 446

題目連結:


題目大意:
給定一個大小為 10 × 10 的字元矩陣,代表 100 個燈泡的開關狀態。「#」代表燈泡是開的,「O」代表關著。而每將一個燈泡打開(或關上),會順帶改變相鄰燈泡(上、下、左、右)的開關狀態。

求將所有燈泡關上最少需要開關幾個燈泡?



範例輸入:
3

##########
##########
##########
##########
##########
##########
##########
##########
##########
##########

OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO
OOOOOOOOOO

#O########
OOO#######
#O########
####OO####
###O##O###
####OO####
##########
########O#
#######OOO
########O#


範例輸出:
0
44
4


解題思維:
窮舉第一列的開關方法,以下是示意圖:
所以會有 2 ^ 10 = 1024 個可能的分支(每個燈泡都可以選擇要不要改變)。

而剩下的列數就按照前一列的開關狀態去開關,例如像是:
第一列為 ##OO##OOOO
第二列為 ##########
因為第一列有一些是開的,我們需要把它關上,因此我們將第二列藍色位置的燈泡打開。
就這樣做到第十列的時候,如果還有燈泡是開的,表示第一列的開關方法無效;如果全關上了,就有可能是最佳的開關方法,還要跟其他的方法比較開關次數。



至於為何這樣子一定會包含到最佳解,以下稍作解釋:
因為每一列會互相影響,第一列影響第二列的燈泡,第二列影響第一、三列等等。而我們可以看到第一列處在邊緣地帶。

當我們窮舉出第一列的開關狀況後,也就只剩下了第二列可以影響它的狀況,也就固定了第二列的開關方式(因為我們要把所有燈泡關上),且第三、四、五 …… 列也是同理。

而我們知道在最佳解下,一個燈泡最多只會主動地變動一次(將其打開或是關上),因為變動兩次會抵消效果,導致一定不是最佳解。正因如此,窮舉了第一列方法之後,一定有其中一種是最佳解第一列的開關狀態。

這就是為何一定會包含到最佳解。而也不一定要窮舉第一列,以這題來說第十列、第一行、第十行都可行,因為都是處於矩陣邊緣的行列。

此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

Ctrl+Shift+W
很經典的一道題目
2019-02-22 23:52:08
Not In My Back Yard
然而本人是今天才恍然大悟其核心解法的概念,獻醜了XD
2019-02-23 00:10:00
Ctrl+Shift+W
太謙虛了,這題我也只是到處看過而已,也沒有實戰過,至少你有辦法解題,對我來說很強 [e5]
2019-02-23 00:12:15
Popsicle
資工新鮮人推
2019-03-21 21:40:18
Not In My Back Yard
獻醜了,感謝您的閱覽XD
2019-03-21 21:57:57
Popsicle
報告 根本看不太懂xd (By小大一
2019-03-21 22:43:09
Not In My Back Yard
把 10 × 10 縮小到 3 × 3 來講,我們只要窮舉出第一列使用燈泡的情況(將開變為關,關變為開),如下列網址中的圖(打勾為使用該燈泡,打叉為不使用該燈泡,其餘的圓圈代表剩下的燈泡) :
https://images2.imgbox.com/12/84/axVI4zKp_o.png

因為對於每個第一列的窮舉情形,可能還有剩下的燈泡還沒關掉。這時,就輪到第二列去將其關閉。(不用窮舉第二列的使用情況,而是直接依據第一列的燈泡開關情形去開/關相應的燈泡,是因為隨意使用第二列的燈泡會變更到剛剛窮舉第一列的情況,使得窮舉毫無意義)
同理,當我們做完第二列的開關後,第二列本身也可能還有剩下的燈泡還尚未關閉,因此輪到第三列去開/關相應的燈泡。

每個方法開關到最後一列結束之後(在此例為第三列結束之後),若還有剩下的開著的燈泡,則此窮舉出來的方式即是不可行的;反之,則是一個可以把全部燈泡關閉的方法。

與此同理,我們可以推及回到 10 × 10 的情況,其也是類似的方式。

以上。如果還是不甚理解,可以自己動筆做做看 3 × 3 試試看,也許會比較能夠理解。
2019-03-21 23:14:04
Popsicle
很詳細的解釋,不過依我目前的能力還差有點遠。有空會想想看的,感謝您
2019-03-22 01:16:09

更多創作