• LeetCode


    N-Queens

    2014.2.13 19:23

    The n-queens puzzle is the problem of placing n queens on an n×n 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.."]
    ]

    Solution:

      The Eight Queens problem is a typical model for backtracking  algorithm.

      For any pair of queens, their difference in x and y coordinates mustn't be 0 or equal, that's on the same row, column or diagonal line.

      The code is short and self-explanatory, please see for yourself.

      Total time complexity is O(n!). Space complexity is O(n!) as well, which comes from local parameters in recursive function calls.

    Accepted code:

     1 // 1CE, 1WA, 1AC, try to make the code shorter, it'll help you understand it better.
     2 class Solution {
     3 public:
     4     vector<vector<string> > solveNQueens(int n) {
     5         a = nullptr;
     6         res.clear();
     7         if (n <= 0) {
     8             return res;
     9         }
    10         
    11         a = new int[n];
    12         solveNQueensRecursive(0, a, n);
    13         delete[] a;
    14         
    15         return res;
    16     }
    17 private:
    18     int *a;
    19     vector<vector<string> > res;
    20     
    21     void solveNQueensRecursive(int idx, int a[], const int &n) {
    22         if (idx == n) {
    23             // one solution is found
    24             addSingleResult(a, n);
    25             return;
    26         }
    27         
    28         int i, j;
    29         // check if the current layout is valid.
    30         for (i = 0; i < n; ++i) {
    31             a[idx] = i;
    32             for (j = 0; j < idx; ++j) {
    33                 if (a[j] == a[idx] || myabs(idx - j) == myabs(a[idx] - a[j])) {
    34                     break;
    35                 }
    36             }
    37             if (j == idx) {
    38                 // valid layout.
    39                 solveNQueensRecursive(idx + 1, a, n);
    40             }
    41         }
    42     }
    43     
    44     void addSingleResult(const int a[], int n) {
    45         vector<string> single_res;
    46         char *str = nullptr;
    47         
    48         str = new char[n + 1];
    49         int i, j;
    50         for (i = 0; i < n; ++i) {
    51             for (j = 0; j < n; ++j) {
    52                 str[j] = '.';
    53             }
    54             str[j] = 0;
    55             str[a[i]] = 'Q';
    56             single_res.push_back(string(str));
    57         }
    58         
    59         res.push_back(single_res);
    60         single_res.clear();
    61         delete []str;
    62     }
    63     
    64     int myabs(const int x) {
    65         return (x >= 0 ? x : -x);
    66     }
    67 };
  • 相关阅读:
    HDU 2078 复习时间
    HDU 2076 夹角有多大
    邮票(codevs 2033)
    特种部队(codevs 1427)
    小a和uim之大逃离(洛谷 1373)
    地铁间谍(洛谷 2583)
    推销员(codevs 5126)
    小朋友的数字(codevs 3293)
    车站分级(洛谷 1983)
    Code(poj 17801)
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3548617.html
Copyright © 2020-2023  润新知