切換
舊版
前往
大廳
主題

ZeroJudge - c133: 00639 - Don't Get Rooked 解題心得

Not In My Back Yard | 2019-10-04 22:49:21 | 巴幣 2 | 人氣 178

題目連結:


題目大意:
給定一正整數 n (1 ≦ n ≦ 4,n = 0 時代表輸入結束),代表一個 n × n 的棋盤。
接著的 n 列輸入,每列有 n 個字元(「.」代表空格;「X」則代表牆壁。字元只會是這兩種之一),代表著這個棋盤的擺置內容。

求這個棋盤上最多可以放多少個城堡(Rook)。

注:城堡的移動方向為水平、垂直方向任意格數,但是會被「牆」擋住。



範例輸入:
4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0


範例輸出:
5
1
5
2
4


解題思維:
典型的深度優先搜尋(Depth First Search,DFS)題目。

假設變數 R 是城堡數。設 R 一開始為 1 ,然後一直 + 1 。然後針對每個 R 值去試試看可不可以在這個棋盤上放上 R 個城堡。

而試驗的方法就是 DFS 的精神:
在棋盤上找一個空的位置(即「.」),然後在這邊放一個城堡並將垂直水平延伸的位置通通設為不能放置城堡的狀態(延伸值到碰到牆壁「X」)。

然後,遞迴放放看 R - 1 個城堡。如果在任何的遞迴堆疊層有 R = 0 ,即代表可以放完。因此,代表可以放置 R (原本的 R ,不是遞迴後的)個城堡在此棋盤上。

然後當增加 R 值增加到無法成功放置時,即代表 R - 1 是最多能放的數量。此即為所求。

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

創作回應

更多創作