虫虫首页|资源下载|资源专辑|精品软件
登录|注册

您现在的位置是:首页 > 技术阅读 >  每日一题:N皇后问题

每日一题:N皇后问题

时间:2024-02-14


N皇后

设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行、不同列,也不在对角线上。这里的“对角线”指的是所有的对角线,不只是平分整个棋盘的那两条对角线。

示例:

 输入:4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..",  // 解法 1
 "...Q",
 "Q...",
 "..Q."],

["..Q.",  // 解法 2
 "Q...",
 "...Q",
 ".Q.."]
]

分析

N皇后是经典的回溯问题,就是每一步都尝试,每一步都看当前位置是否符合规则,下面我们直接看代码吧。

代码

class Solution {
public:
   vector<vector<string>> solveNQueens(int n) {
       used.resize(n, vector<bool>(n, false));
       backtrace(used, 0);
       return ret;
   }

   vector<vector<bool>> used;
   vector<vector<string>> ret;

   void backtrace(vector<vector<bool>> &used, int row) {
       if (row == used.size()) {
           PushString(used);
           return;
       }
       int col = used[0].size();
       for (int i = 0; i < col; ++i) {
           if (IsValid(used, row, i)) {
               used[row][i] = true;
               backtrace(used, row + 1);
               used[row][i] = false;
           }
       }
   }

   void PushString(vector<vector<bool>> &used) {
       vector<string> vec;
       for (auto &v : used) {
           string tem;
           tem.resize(v.size(), '.');
           for (int i = 0; i < v.size(); ++i) {
               if (v[i]) tem[i] = 'Q';
           }
           vec.push_back(tem);
       }
       ret.push_back(vec);
   }

   bool IsValid(vector<vector<bool>> &used, int i, int j) {
       int row = used.size();
       int col = used[0].size();
       for (int ii = 0; ii < i; ++ii) {
           if (used[ii][j]) return false;
       }
       for (int jj = 0; jj < j; ++jj) {
           if (used[i][jj]) return false;
       }
       for (int ii = i - 1, jj = j - 1; ii >= 0 && jj >= 0; ii--, jj--) {
           if (used[ii][jj]) return false;
       }
       for (int ii = i - 1, jj = j + 1; ii >= 0 && jj < col; ii--, jj++) {
           if (used[ii][jj]) return false;
       }
       return true;
   }

};


更多精彩推荐,请关注我们


代码精进之路


  代码精进之路,我们一起成长!




C++数组长度可以为变量吗?

C++中glog源码剖析以及如何设计一个高效log模块

想看懂stl代码,先搞定type_traits是关键

C++线程池的实现