leetcode 51 N皇後問題
阿新 • • 發佈:2019-04-13
== 排列問題 ++ ret http 問題 pan clas temp
其實就是全排列問題+剪枝,也是很經典很經典
代碼:
class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>> res; vector<int> pos(n,-1);//記錄第i+1行的皇後,應該放在第j+1列 int row=0; DFS(n,row,pos,res); return res; }void DFS(int n,int row,vector<int>& pos,vector<vector<string>>& res){ //回溯法,能到下一條語句一定合法 //遞歸邊界1,得到最終的解; if(row==n){ vector<string> temp(n,string(n,‘.‘)); for(int i=0;i<n;i++){ temp[i][pos[i]]=‘Q‘; } res.push_back(temp); }else{ for(int col=0;col<n;col++){ //新加皇後到row+1行,col+1列合法,進入子問題;如果新皇後怎麽加都無效,則本次循環結束,col+1進行下一次循環 //判斷是否需要向子問題遞歸,不需要則返回上一層; if(isvalid(pos,row,col)){ pos[row]=col; DFS(n,row+1,pos,res); pos[row]=-1; } } } } bool isvalid(vector<int>& pos,int row,int col){ //判斷是否放在了已經有皇後的列上,以及是否在同一對角線上; for(int i=0;i<row;i++){ if((col==pos[i])||(abs(row-i)==abs(col-pos[i]))) return false; } return true; } };
leetcode 51 N皇後問題