N-Queens N皇后放置问题 回溯法

原创 2015年07月09日 19:30:17

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

Hide Tags
 Backtracking
class Solution {
public:
    vector<vector<string> > res;
    
    vector<vector<string>> solveNQueens(int n) {
        
        int *a=new int[n];
        memset(a,0,sizeof(int)*n);
        solve(a,n,0);
        return  res;
    }
    
    void solve(int *a, int n,int index)
    {
        for(int i=0;i<n;i++)//对每个index 寻找第i列放皇后
        {
            if(isValid(a,n,index,i))//index i 行 列
            {
                a[index]=i;
                if(index==n-1)
                {
                    print(a,n);
                    a[index]=0;
                    return ;
                }
                solve(a,n,index+1);
                a[index]=0;
            }
        }
    }
    
    void print(int *a, int n)
    {
        vector<string> path;
        for(int i=0;i<n;i++)
        {
            string s(n,'.');
            s[a[i]]='Q';
            path.push_back(s);
        }
        res.push_back(path);
    }
    
    bool isValid(int *a,int n,int x,int y)
    {
        int col;
        for(int i=0;i<x;i++)//行
        {
            col=a[i];//第i行,皇后在第col列
            if(y==col) //同列
                return false;
            if((col-y)==(i-x))// 对角线'\'
                return false;
            if((col-y)==(x-i))// 对角线'/'
                return false;
        }
        return true;
    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。

华为OJ之N皇后问题(C++代码)

1问题描述 N皇后问题,就是如何将国际象棋中的N个皇后放在N*N的棋盘上而不会互相攻击,是一种通过枚举,再递归、回溯的思想。2思路 以8皇后问题为例,可知在8*8二维数组中,每个点用data[i]...
  • chenloxiaoea
  • chenloxiaoea
  • 2015年12月10日 10:46
  • 2417

杭电OJ(HDOJ)2553题:N皇后问题(回溯法)

题意: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。 你的任务是,对于给定的N,求出有多少种合法的放置方法。 ...
  • u014174811
  • u014174811
  • 2015年01月12日 22:09
  • 830

51.leetcode N-Queens(hard)[递归回溯剪枝]

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
  • qz530308783
  • qz530308783
  • 2016年08月25日 16:48
  • 175

leetcode -- N-Queens I&II,经典回溯,再看

https://leetcode.com/problems/n-queens/https://leetcode.com/problems/n-queens-ii/参考 递归回溯 http://ww...
  • xyqzki
  • xyqzki
  • 2015年12月16日 16:19
  • 226

回溯法及N皇后问题

回溯法是一种系统地搜索问题解答的方法。在搜索的过程中尝试找到问题的解,如果发现找不到了,就退一步,往上回溯(剪枝过程)。对于许多复杂问题和大规模问题都可以使用回溯法。 回溯法的基本思想是按照深度优先...
  • charles1e
  • charles1e
  • 2016年06月12日 15:55
  • 1180

回溯法解决N皇后问题(java实现)

回溯法解决N皇后问题(java实现)
  • qq_22222499
  • qq_22222499
  • 2017年04月30日 13:26
  • 574

回溯法:八皇后问题

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后...
  • T_27080901
  • T_27080901
  • 2015年05月17日 12:24
  • 3763

回溯法解决N皇后问题

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同...
  • wuqiuping695
  • wuqiuping695
  • 2015年08月16日 17:06
  • 868

回溯法--------n后问题

n后问题: 1.问题描述: 在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇...
  • cjq950918
  • cjq950918
  • 2017年05月10日 09:47
  • 545

N皇后问题与回溯法

八皇后问题,快三个月了,原来不会写现在还是不会,感觉递归还是不理解,每次看别人的代码都要想一下,更不讲自己写了 这里明显用到了回溯法,这种递归我看看是没问题的,可以说比较简单,但自己写就难了 回溯...
  • SeasonJoe
  • SeasonJoe
  • 2015年12月17日 22:42
  • 1200
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:N-Queens N皇后放置问题 回溯法
举报原因:
原因补充:

(最多只允许输入30个字)