国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

深入N皇后問題的兩個最高效算法的詳解

2020-01-26 16:09:01
字體:
來源:轉載
供稿:網友
N皇后問題是一個經典的問題,在一個N*N的棋盤上放置N個皇后,每行一個并使其不能互相攻擊(同一行、同一列、同一斜線上的皇后都會自動攻擊)。
一、 求解N皇后問題是算法中回溯法應用的一個經典案例
回溯算法也叫試探法,它是一種系統(tǒng)地搜索問題的解的方法。回溯算法的基本思想是:從一條路往前走,能進則進,不能進則退回來,換一條路再試。
在現實中,有很多問題往往需要我們把其所有可能窮舉出來,然后從中找出滿足某種要求的可能或最優(yōu)的情況,從而得到整個問題的解。回溯算法就是解決這種問題的“通用算法”,有“萬能算法”之稱。N皇后問題在N增大時就是這樣一個解空間很大的問題,所以比較適合用這種方法求解。這也是N皇后問題的傳統(tǒng)解法,很經典。
下面是算法的高級偽碼描述,這里用一個N*N的矩陣來存儲棋盤:
1) 算法開始, 清空棋盤,當前行設為第一行,當前列設為第一列
2) 在當前行,當前列的位置上判斷是否滿足條件(即保證經過這一點的行,列與斜線上都沒有兩個皇后),若不滿足,跳到第4步
3) 在當前位置上滿足條件的情形:
在當前位置放一個皇后,若當前行是最后一行,記錄一個解;
若當前行不是最后一行,當前行設為下一行, 當前列設為當前行的第一個待測位置;
若當前行是最后一行,當前列不是最后一列,當前列設為下一列;
若當前行是最后一行,當前列是最后一列,回溯,即清空當前行及以下各行的棋盤,然后,當前行設為上一行,當前列設為當前行的下一個待測位置;
以上返回到第2步
4) 在當前位置上不滿足條件的情形:
若當前列不是最后一列,當前列設為下一列,返回到第2步;
若當前列是最后一列了,回溯,即,若當前行已經是第一行了,算法退出,否則,清空當前行及以下各行的棋盤,然后,當前行設為上一行,當前列設為當前行的下一個待測位置,返回到第2步;
算法的基本原理是上面這個樣子,但不同的是用的數據結構不同,檢查某個位置是否滿足條件的方法也不同。為了提高效率,有各種優(yōu)化策略,如多線程,多分配內存表示棋盤等。

在具體解決該問題時,可以將其拆分為幾個小問題。首先就是在棋盤上如何判斷兩個皇后是否能夠相互攻擊,在最初接觸這個問題時,首先想到的方法就是把棋盤存儲為一個二維數組,然后在需要在第i行第j列放置皇后時,根據問題的描述,首先判斷是在第i行是否有皇后,由于每行只有一個皇后,這個判斷也可以省略,然后判斷第j列是否有皇后,這個也很簡單,最后需要判斷在同一斜線上是否有皇后,按照該方法需要判斷兩次,正對角線方向和負對角線方向,總體來說也不難。但是寫完之后,總感覺很笨,因為在N皇后問題中這個函數的使用次數太多了,而這樣做效率較差,個人感覺很不爽。上網查看了別人的實現之后大吃一驚,大牛們都是使用一個一維數組來存儲棋盤,在某個位置上是否有皇后可以相互攻擊的判斷也很簡單。具體細節(jié)如下:
把棋盤存儲為一個N維數組a[N],數組中第i個元素的值代表第i行的皇后位置,這樣便可以把問題的空間規(guī)模壓縮為一維O(N),在判斷是否沖突時也很簡單,首先每行只有一個皇后,且在數組中只占據一個元素的位置,行沖突就不存在了,其次是列沖突,判斷一下是否有a[i]與當前要放置皇后的列j相等即可。至于斜線沖突,通過觀察可以發(fā)現所有在斜線上沖突的皇后的位置都有規(guī)律即它們所在的行列互減的絕對值相等,即| row 主站蜘蛛池模板: 库尔勒市| 嘉荫县| 礼泉县| 喀什市| 龙井市| 达拉特旗| 翁牛特旗| 关岭| 通城县| 区。| 高阳县| 平远县| 汉川市| 防城港市| 白沙| 德安县| 晋城| 囊谦县| 呼图壁县| 江陵县| 黑河市| 深圳市| 盖州市| 凤翔县| 五莲县| 玛曲县| 横峰县| 泸定县| 岐山县| 常德市| 孝义市| 龙口市| 江孜县| 九寨沟县| 新龙县| 德保县| 绍兴县| 丽江市| 阿拉善左旗| 仙居县| 舒兰市|