• LeetCode OJ:N-Queens(N皇后问题)


    Given an integer n, return all distinct solutions to the n-queens puzzle.

    Each solution contains a distinct board configuration of the n-queens' placement, where 'Q' and '.' both indicate a queen and an empty space respectively.

    For example,
    There exist two distinct solutions to the 4-queens puzzle:

    [
     [".Q..",  // Solution 1
      "...Q",
      "Q...",
      "..Q."],
    
     ["..Q.",  // Solution 2
      "Q...",
      "...Q",
      ".Q.."]
    ]

    经典的N皇后问题,我首先是用brute force,但是这样做的话一直会TLE:

     1 class Solution {
     2 public:
     3     vector<vector<string>> solveNQueens(int n) {
     4         vector<int> board(n);
     5         vector<vector<string>> ret;
     6         vector<string> tmpVec;
     7         for(int i = 0; i < n; ++i){
     8             board[i] = i + 1;//确保了上下左右不会有相邻的元素
     9         }
    10         vector<int> afterAdd(n);
    11         vector<int> afterSub(n);
    12         for(;;){
    13             transform(board.begin(), board.end(), afterAdd.begin(), 
                  [](int i)->int{static int index = 1; i += index; index++; return i;}); 14 transform(board.begin(), board.end(), afterSub.begin(),
                  [](int i)->int{static int index = 1; i -= index; index++; return i;}); 15 set<int>afterSubSet(afterSub.begin(), afterSub.end()); 16 set<int>afterAddSet(afterAdd.begin(), afterAdd.end()); 17 if(afterAddSet.size() == n && afterSubSet.size() == n){ 18 for(int i = 0; i < n; i++){ 19 string tmp = ""; 20 for(int j = 0; j < n; ++j){ 21 tmp.append(1, j == board[i]-1 ? 'Q' : '.'); 22 } 23 tmpVec.push_back(tmp); 24 tmp.clear(); 25 } 26 ret.push_back(tmpVec); 27 tmpVec.clear(); 28 } 29 if(!next_permutation(board.begin(), board.end())){ 30 return ret; 31 break; 32 } 33 } 34 } 35 };

    后来就只能使用dfs了,代码如下:

     1 class Solution {
     2 public:
     3     vector<vector<string>> solveNQueens(int n) {
     4            ret.clear();
     5            memset(canUse, true, sizeof(canUse));
     6            dfs(0,n);
     7            return ret;
     8     }
     9 
    10     bool check(int pos, int line)
    11     {
    12         for(int i = 0; i < line; ++i){
    13             if(line - i == abs(pos - a[i]))    //这一步很重要
    14                 return false; //相差n行的两个皇后的位置不可以也正好相差n个,那样一定是不可以的15         }
    16         return true;
    17     }    
    18 
    19     void dfs(int dep, int maxDep)
    20     {
    21         if(dep == maxDep){
    22             vector<string> tmpVec;
    23             for(int i = 0; i < maxDep; ++i){
    24                 string tmp = "";
    25                 for(int j = 0; j < maxDep; ++j){
    26                     tmp.append(1, j == a[i] ? 'Q' : '.');
    27                 }
    28                 tmpVec.push_back(tmp);
    29                 tmp.clear();
    30             }
    31             ret.push_back(tmpVec);
    32             tmpVec.clear();
    33         }
    34         for(int i = 0; i < maxDep; ++i){
    35             if(canUse[i] && check(i, dep)){
    36                 canUse[i] = false;
    37                 a[dep] = i;
    38                 dfs(dep + 1, maxDep);
    39                 canUse[i] = true;
    40             }
    41         }
    42     }
    43 private:
    44     vector<vector<string>> ret;
    45     int a[100];
    46     bool canUse[100];
    47 };
  • 相关阅读:
    我终于会手打lct了!
    [模板]Dijkstra-优先队列优化-单源最短路
    99999999海岛帝国后传:算法大会
    正在加载中。。。。。
    【题解】CF1054D Changing Array(异或,贪心)
    【题解】P4550 收集邮票(概率期望,平方期望)
    【题解】CF149D Coloring Brackets(区间 DP,记忆化搜索)
    【笔记】斜率优化 DP
    CSP2021 游记
    【题解】洛谷P1502 窗口的星星
  • 原文地址:https://www.cnblogs.com/-wang-cheng/p/4983194.html
Copyright © 2020-2023  润新知