LeetCode 面试题 08.12 - 八皇后

题目描述

面试题 08.12. 八皇后

解法:回溯(C++)

冲突判断,对应当前row和col只需要判断是否和已存在的queen位置是否冲突

  1. queen_pos记录之前放置的所有皇后的位置,索引i表示行信息,对应的值记录的为列信息,size表示有几个皇后。
  2. 行和列分别通过row和col是否与i和queen_pos[i]相等来判断
  3. 副对角线冲突通过row和col之和判断,主对角线通过两点的row和col交叉和判断
class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<int> queen_pos;
        vector<string> one_row_res(n, string(n, '.'));
        vector<vector<string>> res;

        inner(n, 0, queen_pos, one_row_res, res);
        return res;
    }

    void inner(int n, int idx_i, vector<int>& queen_pos, vector<string>& one_row_res, vector<vector<string>>& res){
        if(idx_i==n)
        {
            res.push_back(one_row_res);
            return;
        }
        for(int j=0;j<n;j++)
        {
            if(valid(queen_pos, idx_i, j))
            {
                one_row_res[idx_i][j] = 'Q';
                queen_pos.push_back(j);
                inner(n, idx_i+1, queen_pos, one_row_res, res);
                queen_pos.pop_back();
                one_row_res[idx_i][j] = '.';
            }
        }
    }

    bool valid(vector<int>& queen_pos, int row, int col)
    {
        for(int i=0;i<queen_pos.size();i++)
        {
            if(i==row || col==queen_pos[i] || row+col==i+queen_pos[i] || row+queen_pos[i]==i+col)
                return false;
        }
        return true;
    }
};

你可能感兴趣的:(题解,leetcode)