每天一道LeetCode-----n皇后问题
生活随笔
收集整理的這篇文章主要介紹了
每天一道LeetCode-----n皇后问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
N-Queens
原題鏈接N-Queens
n皇后問題,和數獨問題一樣,都是回溯法的經典題目。
n皇后問題約束是任意兩個皇后不能在一行,不能在一列,不能在同一個45度直線,不能在同一個135度直線上。所以求解時需要記錄
- 當前行是否已經存在一個皇后
- 當前列是否已經存在一個皇后
- 當前位置所在的45度直線上是否已經存在一個皇后
- 當前位置所在的135度直線上是否已經存在一個皇后
因為n行n個皇后,所以每一行有且僅有一個皇后,那么可以不需要記錄當前行是否已經存在皇后,只要在當前行找到一個位置容納皇后,就開始在下一行尋找,即每一行遍歷右邊列,找到滿足后三個條件的位置即可。
所有的約束條件都可以用數組記錄,即
- flag_col[column]表示column列是否已經存在一個皇后
- flag_45[p]表示位置[row, column]所在的45度直線是否出現過皇后,其中p是row和column的函數
- flag_135[q]表示位置[row, column]所在的135度直線是否出現過皇后,其中q是row和column的函數
比較不要記錄的就是45度和135度直線上的情況,可以利用數學思維簡化。
- 對于45度直線,可知斜率為1,即解析式可以寫成y = x + b。那么對于在同一條45度直線的點,截距b是一定的,所以可以用y - x來代表某一條45度直線,所以可以另m = column - row。但是column可能會小于row,導致m為負值,所以可以將m增加n - 1讓m變為正值,即m = n - 1 + column - row
- 對于135度直線,可知斜率為-1,同理可知另m = column + row,此時不存在m為負值的情況,無須加n - 1
- 不過需要注意的是flag_45和flag_135數組的大小是2 * n - 2,設置成2 * n即可
總結
以上是生活随笔為你收集整理的每天一道LeetCode-----n皇后问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天一道LeetCode-----求一个
- 下一篇: 每天一道LeetCode-----找到给