閱讀139 返回首頁    go 阿裏雲 go 技術社區[雲棲]


各大計算機公司 筆試及麵試 題目 - 深信服(八皇後問題)

八皇後問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇後,使得任何一個皇後都無法直接吃掉其他的皇後?為了達到此目的,任兩個皇後都不能處於同一條橫行、縱行或斜線上。八皇後問題可以推廣為更一般的n皇後擺放問題:這時棋盤的大小變為n×n,而皇後個數也變成n。當且僅當 n = 1 或 n ≥ 4 時問題有解。


在n×n格的棋盤上擺放n個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同一行、同一列或同一斜線上,求解滿足條件的棋盤布局。

n-皇後問題是典型的可以使用回溯算法求解的問題。如果你明白了問題的具體執行過程,也就對該問題的特點有了把握,從而選擇合適的算法去求解。

以8-皇後問題為例,假設皇後所在的行用變量row表示,對應的列使用數組column[row]表示。

使用回溯算法執行的過程如下:

(1)第一次放置第1個皇後

將第1個皇後放在第0行第0列,即row=0,column[row]=column[0],如圖所示:

第1個皇後放置在坐標(0,0)處。

(2)第一次放置第2個皇後

因為第1個皇後已經放好,第1個皇後放置到第0行第0列,從第1個皇後下方的格子開始判斷。第2個皇後位於第1行,則row=1:

當column[row]=column[1]=0時,與第1個皇後在同一列上,衝突,繼續後移到下一列(即column[row]++);

當column[row]=column[1]=1時,與第1個皇後在同一對角線上,衝突,繼續後移到下一列(即column[row]++);

當column[row]=column[1]=2時,與第1個皇後不在同一行、同一列、同一對角線上,故放置第2個皇後。

如圖所示:

第2個皇後放置在坐標(1,2)處。

(3)第一次放置第3個皇後

因為第2個皇後已經放好,第2個皇後放置到第1行第2列,從第2個皇後下方的格子開始判斷。第3個皇後位於第2行,則row=2:

當column[row]=column[2]=0時,與第1個皇後在同一對角線上,衝突,繼續後移到下一列(即column[row]++);

當column[row]=column[2]=1時,與第2個皇後在同一對角線上,衝突,繼續後移到下一列(即column[row]++);

當column[row]=column[2]=2時,與第2個皇後在同一列上,衝突,繼續後移到下一列(即column[row]++);

當column[row]=column[2]=3時,與第2個皇後在同一對角線上,衝突,繼續後移到下一列(即column[row]++);

當column[row]=column[1]=4時,與第1、2個皇後不在同一行、同一列、同一對角線上,故放置第3個皇後。

如圖所示:

第3個皇後放置在坐標(2,4)處。

(4)第一次放置第4個皇後

如圖所示:

第4個皇後放置在坐標(3,1)處。

(5)第一次放置第5個皇後

如圖所示:

第4個皇後放置在坐標(4,3)處。其餘依次類推。


代碼如下:



備注:轉載於 https://hi.baidu.com/shirdrn/blog/item/2720311b5cc970108618bfb1.html

最後更新:2017-04-04 07:03:49

  上一篇:go Java JUC之Atomic係列12大類實例講解和原理分解
  下一篇:go PHP 正則匹配 a 鏈接