lintcode 34 N皇后问题

注意回溯 还有重置为零的步骤

class Solution {
public:
    /*
     * @param n: The number of queens
     * @return: All distinct solutions
     */
    vector<vector<string>> solveNQueens(int n) {
        // write your code here
        vector<vector<string>> res;
        int **queens = new int*[n];
        for(int i = 0;i < n;i++){
            queens[i] = new int[n]();
        }
        
        if(n < 1){
            return res;
        }
        help(res,queens,n,0,0);
        return res;
        
    }
    
    void help(vector<vector<string>> &res,int** queens,int n,int i,int j){
        //i,j表示在二维数组中的位置
        if(i > n-1){         //基本情况,n个皇后已经放好,注意是n-1
            vector<string> line = serilier(queens,n);
            res.push_back(line);
            return;
        }else{
            for(int col = 0;col < n;col++){
                if(ispost(queens,n,i,col)){
                    queens[i][col] = 1;
                    help(res,queens,n,i+1,0);//找下一行
                    queens[i][col] = 0;      //注意还要重置为0
                }
            }
        }
        return;
    }
    
    bool ispost(int** queens,int n,int i,int j){
        for(int row = 0;row < i;row++){
            if(queens[row][j] == 1){
                return false;
            }
        }
        for(int col = 0;col < j;col++){
            if(queens[i][col] == 1){
                return false;
            }
        }
        for(int row = i,col = j; row >=0 && col >=0;row--,col--){
            if(queens[row][col] == 1){
                return false;
            }
        }
        for(int row = i,col = j; row >=0 && col <n;row--,col++){
            if(queens[row][col] == 1){
                return false;
            }
        }
        return true;
    }
    
    vector<string> serilier(int** queens,int n){
        vector<string> res;
        for(int i= 0;i < n;i++){
            string l;
            for(int j= 0;j < n;j++){
                if(queens[i][j] == 0){
                    l += ".";
                }else{
                    l +="Q";
                }
            }
            res.push_back(l);
        }
        return res;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、十月整体分析(主要分析说明十月份的三个核心目标的完成情况)期待1:方案统一讲解确认:10月23号到基地以后,已...
    a1a88c3a5c84阅读 499评论 0 1
  • 声明:原文作者是简书作者――公子以泽。 自己连抄带写写了一点,写不下去啦,哈哈。 兔丸是阴阳师里的一个式神。 ==...
    白桦不是桦阅读 668评论 1 0