1. 程式人生 > >leetcode 51 N皇後問題

leetcode 51 N皇後問題

== 排列問題 ++ 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皇後問題