iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0

西洋棋的皇后,可以直走,橫走,或是斜走.是西洋棋中最為強力的一枚棋子.在正式的規則中只有一個.

而著名的的八皇后問題,則是要在一個標準的西洋棋盤上,放下八個皇后,而且皇后之間不會互相攻擊.例如以下是其中一種解法:

https://github.com/officeyuli/itHome2022/raw/main/day9/v2-cca0d29c32ef9df0f70dc54a316f12a7_1440w.png

很明顯,答案一定不只這一種,那我們有沒有辦法利用演算法找出全部的解答呢?

這個問題的本質跟全排列問題差不多,決策樹的每一層表示棋盤的每列,每個節點可以做的選擇是,在一行的任意行放一個皇后.

讓我們來看看程式碼

    var strings: List<Array<Array<String>>> = ArrayList()

這邊對於檢查的issValid做了一點優化,因為我們皇后是從上往下一行一行放,所以只要檢查正上方,左上方,右上方的三個方向.

而backtrack就是在決策樹行走的指標,row跟col可以控制目前檢索的節點,而isValid可以進行剪枝.

當n=8的時候,就是著名的8皇后問題,數學家高斯窮極一生也沒有想出來.

但是在這個演算法之下,時間複雜度仍然是n^n+1的指數程度.而且沒有辦法優化了.在n=10的時候,就花費大量的時間了.

所以,如果題目改成只要找到一個解答,那我們就能夠修改演算法,不用把所有的答案算出來,就能夠大幅降低演算法的時間.看好題目的需求,來設計演算法,這個技巧以後也會常常用到.


上一篇
Day 8 : 回溯演算法
下一篇
Day 10 : BFS演算法
系列文
從零開始的LeetCode生活,使用Kotlin學習刷題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
John Lu
iT邦新手 3 級 ‧ 2022-09-16 00:25:23

經典演算法問題,推!

我要留言

立即登入留言