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

Subscribe to see which companies asked this question

主要参考 http://blog.csdn.net/hackbuteer1/article/details/6657109

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        int i;
        //初始化
        for (i=0; i<n*n; i++) {
            _queue_arr[i] = INIT_VAL;
        }
        vector<vector<string>> res;
        int row = 0;
        int col = 0;
        //遍历每一行
        while (row < n) {
            //遍历每一列
            while (col < n) {
                //如果冲突,就计算下一列
                if (is_conflict(row, col, n)) {
                    col++;
                } else {
                    _queue_arr[row] = col;
                    col = 0;
                    break;
                }
            }
            //遍历完每一列后,检查是否成功放置皇后
            //如果失败
            if (col == n) {
                //如果当前行是第0行了,就说明所有的jie都被求出了
                if (0 == row) {
                    break;
                } else {
                    //如果不是,就从上一行的下一列开始放置皇后,并进行判断
                    row--;
                    col = _queue_arr[row];
                    col++;
                    _queue_arr[row] = INIT_VAL;
                    continue;
                }
                //如果当前行是最后一行了,就输出
            } else if (row == n - 1) {
                handle_result(res, n);
                col = _queue_arr[row] + 1;
                _queue_arr[row] = INIT_VAL;
                continue;
                //不是最后一行,就计算下一行
            } else {
                row++;
            };
        }
        return res;
    }

private:
    /*
     * 判断是否冲突,主要检测方式是 ,如果冲突
     * queue_arr[i] == queue_arr[j]
     * |queue_arr[i] -  queue_arr[j]| = |i - j|
     *
     * @param row: 当前行
     * @param col: 当前列
     * @param n: 所有的行数和列数
     */
    bool is_conflict(int row, int col, int n) const{
        int i;
        for (i=0; i<n; i++) {
            if (_queue_arr[i] == col || abs(_queue_arr[i] - col) == abs(i - row)) {
                return true;
            }
        }
        return false;
    }

    /*
     * 处理结果
     * @param res_str 结果集合
     * @param n  行数
     */
    void handle_result(vector<vector<string>> &res_str, int n) {
        vector<string> slu_str;
        int i,j;
        for (i=0; i<n; i++) {
            string tmp = "";
            for (j=0; j<n; j++) {
                if (_queue_arr[i] == j) {
                    tmp += "Q";
                } else {
                    tmp += ".";
                }
            }
            slu_str.push_back(tmp);
        }
        res_str.push_back(slu_str);
    }

private:
    int _queue_arr[1000];
    const static int INIT_VAL = -10000;

};
时间: 2024-10-11 14:36:47

N-Queens的相关文章

lintcode 中等题:N Queens N皇后问题

题目: N皇后问题 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击.<不同行,不同列,不同对角线> 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置. 样例 对于4皇后问题存在两种解决的方案: [ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], [&qu

Python----递归------Eight Queens 八皇后问题

递归思想是算法编程中的重要思想. 作为初学者,对递归编程表示很蒙逼,每次遇到需要递归的问题,心里就有一万头草泥马飞过~~~~~~(此处略去一万头草泥马) 在B站看数据结构与算法的视频时,视频中给了两个非常典型的例子--<汉诺塔>和<八皇后问题>,就希望自己用Python实现一下这两个递归程序,其中汉诺塔问题比较简单,还是能够理解,这里就不讲了. <八皇后问题>:说要在一个棋盘上放置8个皇后,但是不能发生战争,皇后们都小心眼,都爱争风吃醋,如果有人和自己在一条线上(水平.

lintcode 中等题:N Queens II N皇后问题 II

题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递归的时候才能保存结果,参考程序 java程序: class Solution { /** * Calculate the total number of distinct N-Queen solutions. * @param n: The number of queens. * @return:

051 N Queens

此题即在 052 N Queens 2 基础上稍作改进 并注意返回格式就好 import copy class Solution: def __init__(self): self.ans = [] # @param {integer} n # @return {integer} def solveNQueens(self, n): self.helper(0,[["."]* n for i in range(0,n)],n) return self.ans def helper(se

Sicily 1172. Queens, Knights and Pawns

Constraints Time Limit: 1 secs, Memory Limit: 64 MB Description You all are familiar with the famous 8-queens problem which asks you to place 8 queens on a chess board so no two attack each other. In this problem, you will be given locations of queen

54. 八皇后问题[eight queens puzzle]

[本文链接] http://www.cnblogs.com/hellogiser/p/eight-queens-puzzle.html [题目] 在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法. [分析] 之前博文28.字符串的排列[StringPermutation]介绍过字符串的全排列,八皇后问题也可以转换为全排列问题. 由于八个皇后的任意两个不

poj3239 Solution to the n Queens Puzzle (n皇后问题)

Solution to the n Queens Puzzle Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3494   Accepted: 1285   Special Judge Description The eight queens puzzle is the problem of putting eight chess queens on an 8 × 8 chessboard such that none

[Leetcode] n queens n皇后问题

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

SGU 224.Little Queens

时间限制:0.75s 空间限制:6M 题意 n*n(n<=10)的棋盘,求出放置m(m<=n*n)个皇后的方案数. Solution: 状态压缩+位运算  搜索. 首先我们从上往下逐行放置, DFS(line, row, l, r, k) line :当前行号 row:列状态 l:\ 左上对角线状态 r:/右上对角线状态 k:已放置棋子数 对于每一行有不放或者放一个棋子两种方案 放一个棋子时又要考虑哪些位置可以放置, 状态压缩(row,r,l): 例如当n=4时 二进制数 1=(0001)2代

【算法】N Queens Problem

/* ** 目前最快的N皇后递归解决方法 ** N Queens Problem ** 试探-回溯算法,递归实现 */ #include "stdafx.h" #include "iostream" #include <math.h> using namespace std; #include "time.h" // sum用来记录皇后放置成功的不同布局数:upperlim用来标记所有列都已经放置好了皇后. long sum = 0,