数据结构与算法-- 八皇后问题(多种实现方案)
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法-- 八皇后问题(多种实现方案)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
八皇后問題解法一(排列篩選法)
- 本篇我們承接上一篇中的思想,想到了一個(gè)經(jīng)典的算法題,八皇后問題:
- 題目:在8*8的國(guó)際象棋上擺放8個(gè)皇后,使得其互相不能攻擊,即任意兩個(gè)換后不能在同一行,同一列,或者同一對(duì)角線上。如下圖中所示,就是一個(gè)符合預(yù)期的擺放方式,問總共有多少中擺放方式。
-
上圖中的數(shù)字代表此處放置一個(gè)皇后,并且從上到下依次是0~7 總共8個(gè)。
-
分析:
- 由于8個(gè)皇后任意兩個(gè)不能處在同一行,那么肯定每個(gè)皇后占據(jù)一行。
- 有上圖看,我們必然可以用數(shù)組來標(biāo)識(shí)myQueen[8] 數(shù)組,數(shù)組中i 個(gè)數(shù)字表示位于第i 行的皇后
- 例如以上圖為案例可以用數(shù)組 myQueen[8] = {4,2,0,5,7,1,3,6} 來標(biāo)識(shí)這種擺放的可能,
- 就是我們直接用數(shù)組下標(biāo)當(dāng)成皇后所在的列
- 用數(shù)組的下標(biāo)對(duì)應(yīng)的值當(dāng)成皇后所在的行
- 那么現(xiàn)在我們的思路就是求出 myQueen數(shù)組的全排列,接著在篩選出符合要求的
- 符合要求的情況:
- 我們依據(jù)以上思路得到的全排列,天然就不會(huì)再同一行,也不會(huì)在同一列
- 只需要篩選左右對(duì)角線上是否有其他數(shù)據(jù),那么只需要對(duì)比下標(biāo) i 和 j的差值與 i和j 下標(biāo)對(duì)應(yīng)的value的差值是否相等
- i - j == myQueen[i] -myQueen[j] || j-i == myQueen[i] - myQueen[j]
- 以上判斷可以用具體案例來驗(yàn)證此處略。
-
依據(jù)如上分析有如下代碼:
八皇后問題解法二(動(dòng)態(tài)規(guī)劃)
-
接上文中,依然可以用數(shù)組 myQueen[8] = {4,2,0,5,7,1,3,6} 來標(biāo)識(shí)這種擺放的可能
-
那么上文中將所有排列列舉出來后在對(duì)排列集合進(jìn)行篩選得到最終的八皇后集合
-
類似的思路,我們用窮舉法將數(shù)組myQueen中包含0 ~ 7 的所有數(shù)字的可能一一列舉,并且實(shí)時(shí)篩選,這樣我們可以一個(gè)步驟直接得到想要的集合
-
經(jīng)過如上分析有如下代碼:
八皇后問題解法三(回朔遞歸)
- 依然可以用數(shù)組 myQueen[8] = {4,2,0,5,7,1,3,6} 來標(biāo)識(shí)這種擺放的可能
- 首先將第一個(gè)皇后放入第一列位置
- 接著將第二個(gè)皇后分別放入第二三四等之后的位置,每次分別去檢查放入的位置是否與之前的位置中放入的皇后是否在同一列,同一對(duì)角線
- 接著依次對(duì)地三個(gè),第四個(gè),直到第八個(gè)皇后重復(fù)第二步驟,找出每個(gè)皇后所有合法的位置
- 方法三 與方法二的實(shí)現(xiàn)方式非常類似,區(qū)別在于篩選,方法三種的篩選只需要對(duì)比最后一個(gè)元素與之前的元素是否沖突,在方法三中是每個(gè)皇后的位置依次檢查,當(dāng)進(jìn)行到第5個(gè)皇后的時(shí)候,能保證前4個(gè)皇后的位置都是合法的,無需在檢查之前的。
- 具體實(shí)現(xiàn)方案如下,方法三實(shí)現(xiàn)方案更好理解。
總結(jié)
- 以上兩個(gè)方法的整體思路類似,當(dāng)題目需要我們按照一定規(guī)則擺放若干個(gè)數(shù)字的時(shí)候,我們可以先求出這些數(shù)字的所有可能,然后在一一判斷每個(gè)組合是否滿足題目給定的要求。
- 方法一利用上一篇中的排列的算法得出所有排列可能,接著篩選,時(shí)間復(fù)雜度O( n3 )
- 方法二 利用遞歸窮舉方法得出所有數(shù)字的可能,并同時(shí)篩選,時(shí)間復(fù)雜度也是O(n3)
- 兩種算法的時(shí)間復(fù)雜度都并非很優(yōu),如有更好的算法思想,求在評(píng)論指出
上一篇:數(shù)據(jù)結(jié)構(gòu)與算法–字符串的排列組合問題
下一篇:數(shù)據(jù)結(jié)構(gòu)與算法-- 數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字(時(shí)間復(fù)雜度的討論)
總結(jié)
以上是生活随笔為你收集整理的数据结构与算法-- 八皇后问题(多种实现方案)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 秋葵炒鸡蛋的功效与作用、禁忌和食用方法
- 下一篇: 青皮石榴的功效与作用、禁忌和食用方法