天天看點

回溯法--八皇後問題(6)

問題描述:在8×8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處于同一行、同一列或同一斜線上,問有多少種擺法。 

回溯法--八皇後問題(6)

解題思路:首先A[0][0]位置放一個,A[2][1]位置放一個,A[4][2]位置放一個,A[1][3]位置放一個,A[3][4]位置放一個,A[5][5]位置放一個,A[7][6]位置放一個,結果發現這種方式不行,沒法将第八個皇後放到第八列的位置,這個時候就開始回溯到第七列,如果不行,繼續回溯到第六列,以此回溯,直到能夠獲得結果為止。

coding:

注意了解,我們所得到的八個皇後肯定是在每一列上都會存在,是以我們隻需要建立一個一維數組即可。

回溯法--八皇後問題(6)

記錄每一個方格是否可以存放皇後

回溯法--八皇後問題(6)

 這裡要考慮的就是在已經放了皇後的位置上,它的該行所有格子都不能再放皇後了。

回溯法--八皇後問題(6)

 考慮正斜方向

回溯法--八皇後問題(6)
回溯法--八皇後問題(6)

同理:反斜方向

回溯法--八皇後問題(6)

現在開始存放皇後

回溯法--八皇後問題(6)

接下來開始遞歸的存放後面剩餘的皇後

回溯法--八皇後問題(6)

找到了一個解決方案 

回溯法--八皇後問題(6)

這裡面就設計到了回溯法,當getCount(n+1)發現放不了的話,它就會通過遞歸回到前一列,也就是cols[n]中n會+1繼續來判斷,然後還不行繼續遞歸回到前一列。

回溯法--八皇後問題(6)

增加一個列印方法

回溯法--八皇後問題(6)
回溯法--八皇後問題(6)

 main主函數

回溯法--八皇後問題(6)

運作結果

回溯法--八皇後問題(6)

繼續閱讀