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