• [Leetcode 91] 51 N-Queens


    Problem:

    The n-queens puzzle is the problem of placing n queens on an nn chessboard such that no two queens attack each other.

    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.."]
    ]

    Analysis:

    Classic DFS problem. During the enumeration, we set the '.' to 'Q' level by level. So we don't need to judge whether there is level collision. We use a one-dimension array to keep track of whether a column has already contains a Queen. And for diagonal and anti-diagonal, we make use of the property that slope of diagonal elements is 1 and of anti-diagonal is -1 to find those positions to be checked and then check. 

    There are still many optimizations can be done to further improve the solution

    Code:

     1 class Solution {
     2 public:
     3     int dim, *col;
     4     vector<vector<string> > res;
     5 
     6     vector<vector<string> > solveNQueens(int n) {
     7         // Start typing your C/C++ solution below
     8         // DO NOT write int main() function
     9         dim = n;
    10         res.clear();
    11         
    12         string s(n, '.');
    13         col = new int[n];
    14         vector<string> tmp;
    15         for (int i=0; i<n; i++) {
    16             col[i] = 0;
    17             tmp.push_back(s);
    18         }
    19 
    20         dfs(tmp, 0);
    21         
    22         delete [] col;
    23         
    24         return res;
    25     }
    26     
    27     
    28 private:
    29     void dfs(vector<string> &s, int r) {
    30         if (r == dim) {
    31             res.push_back(s);
    32             return ;
    33         }
    34 
    35         for (int i=0; i<dim; i++) {
    36             if (col[i] == 0 && isValid(s, r, i)) {
    37                 col[i] = 1;
    38                 s[r][i] = 'Q';
    39                 dfs(s, r+1);
    40                 s[r][i] = '.';
    41                 col[i] = 0;
    42             }
    43         }
    44     }
    45 
    46 
    47     bool isValid(vector<string> &s, int r, int c) {
    48         for (int i=0; i<dim; i++) {
    49             for (int j=0; j<dim; j++) {
    50                 if ((abs(i-r) == abs(j-c)) || abs(i-r) == -abs(j-c)) {
    51                     if (s[i][j] == 'Q')
    52                         return false;
    53                 }
    54             }
    55         }
    56 
    57         return true;
    58     }
    59 };
    View Code
  • 相关阅读:
    第12组 Alpha冲刺(4/6)
    第12组 Alpha冲刺(3/6)
    第12组 Alpha冲刺(2/6)
    第12组 Alpha冲刺 (1/6)
    第12组(78) 需求分析报告
    第12组(78)团队展示
    结对编程作业
    第06组Beta冲刺(2/5)-(组长)
    第06组Beta冲刺(1/5)-(组长)
    第06组Alpha冲刺(6/6)-(组长)
  • 原文地址:https://www.cnblogs.com/freeneng/p/3220636.html
Copyright © 2020-2023  润新知