leetcode 51. N 皇后 思考分析
生活随笔
收集整理的這篇文章主要介紹了
leetcode 51. N 皇后 思考分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 題目
- 思考
- AC代碼
題目
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。
思考
首先以N=4為例,畫出解空間樹的一部分:
根據模板:
void backtracking(參數) {if(終止條件){存放結果;return;}for(選擇:本層集合中元素(樹中結點孩子的數量就是集合的大小)){處理結點;backtracking(路徑,選擇列表); //遞歸回溯,撤銷處理結果;} }1、確定回溯函數參數,返回值
當前所在的行(層),當前的棋盤布局。
N的大小
全局變量:vector<vector>result;
result是個存放chessboard的變量。
這里的chessboard就相當于之前回溯題目中的path、子結果。
2、確定終止條件:
當遍歷到N的最后一層(n-1)時,再往下一層,我們就需要返回了。
3、確定單層邏輯
如果本行的某列放入皇后,且不違反規則,即可進入下一行探索
4、判斷是否滿足分布條件有三個:
1、皇后不在同一行
2、皇后不在同一列
3、皇后不在同一斜線上
a、同時我們注意,我們探索的時候就是按照深度探索的,所以保證了每一行只有一次賦值Q。所以第一個條件不需要特別處理。
b、由于按照深度往下搜索,所以判斷皇后在同一列的時候可以剪枝:
c、由于按照深度往下探索,所以判斷皇后在同一斜線的時候可以剪枝(注意,斜線分為向右上斜和左上斜兩個方向)
//檢查本行之上的行的右斜線上是否有皇后 for(int i=hang-1,j=lie-1;i>=0 && j>=0;i--,j--) {if(chessboard[i][j] == 'Q') return false; } //檢查本行之上的行的左斜線上是否有皇后 for(int i=hang-1,j=lie+1;i>=0 && j<n;i--,j++) {if(chessboard[i][j] == 'Q') return false; }AC代碼
class Solution { public:vector<vector<string>>result;bool juge_if_valid(int hang,int lie,vector<string>&chessboard,int n){//檢查本行之上的行的同一列是否存在Qfor(int i=0;i<hang;i++){if(chessboard[i][lie] == 'Q') return false;}//檢查本行之上的行的右斜線上是否有皇后for(int i=hang-1,j=lie-1;i>=0 && j>=0;i--,j--){if(chessboard[i][j] == 'Q') return false;}//檢查本行之上的行的左斜線上是否有皇后for(int i=hang-1,j=lie+1;i>=0 && j<n;i--,j++){if(chessboard[i][j] == 'Q') return false;}return true;} void backtracking(int hang,vector<string>& chessboard,int n){if(hang == n){result.push_back(chessboard);return ;}for(int lie = 0;lie < n ;lie++){if(juge_if_valid(hang,lie,chessboard,n) == true){chessboard[hang][lie] = 'Q'; //放置皇后backtracking(hang+1,chessboard,n);chessboard[hang][lie] = '.'; //回溯撤銷}}return ;}vector<vector<string>> solveNQueens(int n) {result.clear();//填充初始棋盤vector<string> chessboard(n,string(n,'.'));backtracking(0,chessboard,n);return result;} }; 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的leetcode 51. N 皇后 思考分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《蜀四贤咏》第七句是什么
- 下一篇: leetcode 37. 解数独 思考分