zoukankan      html  css  js  c++  java
  • Leetcode N-Queens

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

    典型的N皇后问题,对每行元素进行搜索即可
    class Solution {
    public:
        int n;
        vector<vector<string> > res;
        vector<int> queenIndex;
        bool judgePlaceQueen(int x,int y){
            for(int i = 0 ; i < x; ++ i){
                if(abs(i-x) == abs(queenIndex[i]-queenIndex[x]) || queenIndex[i] == y)  return false;
            }
            return true;
        }
        
        void dfs(int index){
            if(index == n){
                vector<string> board(n,string(n,'.'));
                for(int i = 0 ; i < n ; ++ i){
                    board[i][queenIndex[i]] = 'Q';
                }
                res.push_back(board);
                return;
            }
            for(int i = 0 ; i < n; ++ i){
                queenIndex[index] = i;
                if(judgePlaceQueen(index,i)) dfs(index+1);
            }
        }
        
        vector<vector<string> > solveNQueens(int n) {
            this->n  = n;
            for(int i = 0 ;i < n; ++  i) queenIndex.push_back(0);
            dfs(0);
            return res;
        }
    };

     下面用排列组合的方法解决。

    N个皇后放置在NxN的棋盘上,必定每行一个皇后,将每行中的皇后的位置用0~N-1的数字来表示,总共N行,

    这样就是0~N-1数字的排列。这样的排列只满足了任意两个皇后不能处在同一行或者一列上,并不能保证它们在一斜线上。

    在加入数字排列前,判断该数字是否和排列里所有的数字在斜线上:

      如果两个数字在斜线上,那么两数之差的绝对值等于其下标差得绝对值。

    class Solution {
    public:
        vector<vector<string> > solveNQueens(int n) {
            vector<vector<string> > res;
            vector<int> queen(n,0);
            for(int i = 0;  i < n ; ++ i) queen[i] = i;
            do{
                bool flag = false;
                for(int i = 1; i< n && !flag; ++ i){
                    for(int j = 0 ; j < i && !flag; ++ j){
                        if(abs(j-i) == abs(queen[j]-queen[i]) || queen[j] == queen[i]) flag = true;
                    }
                }
                if(!flag){
                    vector<string> board(n,string(n,'.'));
                    for(int i = 0 ; i < n; ++ i) board[i][queen[i]]='Q';
                    res.push_back(board);
                }
            }while(next_permutation(queen.begin(),queen.end()));
            return res;
        }
    };
  • 相关阅读:
    9.11 eventbus
    9.10,,,实现new instanceof apply call 高阶函数,偏函数,柯里化
    9.9 promise实现 写完了传到gitee上面了,这里这个不完整
    9.5cors配置代码
    9.5 jsonp 实现
    9.5 http tcp https总结
    9.3 es6 class一部分 and es5 class 发布订阅
    8.30 cookie session token jwt
    8.30vue响应式原理
    warning: LF will be replaced by CRLF in renard-wx/project.config.json. The file will have its original line endings in your working directory
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3826399.html
Copyright © 2011-2022 走看看