TopCoder Inv 2001 Semi A+B - Tothello
資訊
- 路徑:Tournament \ 1-16 \ 2 - Inv 2001 Semi A+B \ Tothello
- 分數:500
題目
程式介面
1 | Class Name: Tothello |
說明
Tothello 是一個 Othello 遊戲的修改版,Othello 是一種兩人玩的遊戲,一方使用紅色的棋子,一方使用黑色的棋子,輪流在一個 8x8 大小的棋盤上下棋。當一方下棋之後,如果有將對方的棋子兩端包夾起來,對方的棋子就會變成自己的棋子;而若有棋子變成自己的棋子後,又產生其他的包夾,則又可以變成自己的棋子,直到沒有任何包夾。另外自己的回合的時候,也可以選擇 Pass 不下棋。
現在請實作一個程式,能夠找到最好的下法,能夠獲得最多棋子的結果。
注意
redPieces 是一個 String[] 表示紅色棋子目前在棋盤上的位置。
blackPieces 是一個 String[] 表示黑色棋子目前在棋盤上的位置。
使用大寫字母 A - H 和數字 1 - 8 來表示棋盤上的位置,A1 是最左上角,H8 是最右下角。
紅棋和黑棋數量不會相等,因為可能被吃或者 Pass。
包夾可以是垂直、水平或其他對角線上的格子,但不能有空格。例如:
1 | - - - R - - - - |
系統保證輸入
- redPieces 和 blackPieces 陣列:長度範圍為 0-50。
- 陣列元素格式:大寫 A - H 和數字 1 - 8 組成,[A-H][1-8]。
- whoseTurn:Red 或 Black。
- 輸入的棋盤不會有包夾的情況。
- 輸入的位址不會重複。
- 棋盤至少會有一個空格。
範例
1 | 輸入: |
解法
看完題目描述後會發現其實是黑白棋的遊戲,只是規則有些不同,其中多了一種可以不下的選擇。而不下的選擇在這個題目裡面只是用來符合某些情況的邏輯,讓輸入的資料可以有更多彈性,實際上在實作程式時倒是不用考慮。
在這題目中比較需要注意的是,棋盤上的包夾可能會再引起其他包夾,對於這樣的特性我們可以很簡單的使用遞迴來達成。我利用直覺的思考方式設計以下步驟:
- 找出可以下的地方,然後模擬下了之後會增加多少棋子,並找出最大值。
- 下了一個位置後,往八個方位去找可以增加多少棋子,總和起來。
- 每個方位先測試是否有包夾,有的話將包夾的棋子回到第2步遞迴,最後總和起來。
而在實作上需要注意的一點是,我們會去修改棋盤的狀態來模擬每個可能的結果,因此在每個模擬之後應該要有還原動作或者是用複本的方式來模擬,才不會影響到其他的模擬,而我這邊使用複本的方式。另外在進行遞迴前需先將棋盤的狀態更新完成,以免有路徑重複遞迴。
語法
採用較易理解的寫法,效能並非最好
1 | using System; |
延伸閱讀
上一題 TopCoder Inv 2001 Semi A+B - MatchMaker
下一題 TopCoder Inv 2001 Semi A+B - ChessCover
TopCoder - 線上程式設計競賽