問題描述:在8×8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處于同一行、同一列或同一斜線上,問有多少種擺法。
解題思路:首先A[0][0]位置放一個,A[2][1]位置放一個,A[4][2]位置放一個,A[1][3]位置放一個,A[3][4]位置放一個,A[5][5]位置放一個,A[7][6]位置放一個,結果發現這種方式不行,沒法将第八個皇後放到第八列的位置,這個時候就開始回溯到第七列,如果不行,繼續回溯到第六列,以此回溯,直到能夠獲得結果為止。
coding:
注意了解,我們所得到的八個皇後肯定是在每一列上都會存在,是以我們隻需要建立一個一維數組即可。
記錄每一個方格是否可以存放皇後
這裡要考慮的就是在已經放了皇後的位置上,它的該行所有格子都不能再放皇後了。
考慮正斜方向
同理:反斜方向
現在開始存放皇後
接下來開始遞歸的存放後面剩餘的皇後
找到了一個解決方案
這裡面就設計到了回溯法,當getCount(n+1)發現放不了的話,它就會通過遞歸回到前一列,也就是cols[n]中n會+1繼續來判斷,然後還不行繼續遞歸回到前一列。
增加一個列印方法
main主函數
運作結果