58. N-Queens && N-Queens II

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.."]
]
思路: 简单题。全排列。(注意各行各列不同可以直接确定住)
void getSolution(veor<int> &r, vector<vector<string> > &vec) {
    int n = r.size();
    vector<string> vec2;
    for(int i = 0; i < n; ++i) {
        vec2.push_back(string(n, ‘.‘));
        vec2[i][r[i]] = ‘Q‘;
    }
    vec.push_back(vec2);
}

bool judge(vector<int> &r) {
    for(size_t i = 0; i < r.size(); ++i)
        for(size_t j = i+1; j < r.size(); ++j)
            if(j-i == r[j]-r[i] || j-i == r[i]-r[j])
                return false;
    return true;
}

void getPosition(int cur, vector<int> &r, vector<vector<string> > &vec) {
    if(cur == r.size()) {
        if(judge(r))
            getSolution(r, vec);
        return;
    }
    for(int e = cur; e < r.size(); ++e) {
        int t = r[cur];
        r[cur] = r[e];
        r[e] = t;
        getPosition(cur+1, r, vec);
        r[e] = r[cur];
        r[cur] = t;
    }
}

class Solution {
public:
    vector<vector<string> > solveNQueens(int n) {
        vector<vector<string> > vec;
        if(n <= 0) return vec;
        vector<int> r(n);
        for(int i = 0; i < n; ++i) r[i] = i;
        getPosition(0, r, vec);
        return vec;
    }
};

N-Queens II

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.

思路: 比上题好像更简单一些。

bool judge(vector<int> &r) {
    for(size_t i = 0; i < r.size(); ++i)
        for(size_t j = i+1; j < r.size(); ++j)
            if(j-i == r[j]-r[i] || j-i == r[i]-r[j])
                return false;
    return true;
}
void getPosition(int cur, vector<int> &r, int &cnt) {
    if(cur == r.size()) {
        if(judge(r))
            ++cnt;
        return;
    }
    for(int e = cur; e < r.size(); ++e) {
        int t = r[cur];
        r[cur] = r[e];
        r[e] = t;
        getPosition(cur+1, r, cnt);
        r[e] = r[cur];
        r[cur] = t;
    }
}
class Solution {
public:
    int totalNQueens(int n) {
        if(n <= 0) return 0;
        int cnt = 0;
        vector<int> r(n);
        for(int i = 0; i < n; ++i) r[i] = i;
        getPosition(0, r, cnt);
        return cnt;
    }
};

可参考剑指 offer:题28

时间: 2025-01-06 13:56:05

58. N-Queens && N-Queens II的相关文章

[LeetCode] “全排列”问题系列(一) - 用交换元素法生成全排列及其应用,例题: Permutations I 和 II, N-Queens I 和 II,数独问题

转:http://www.cnblogs.com/felixfang/p/3705754.html 一.开篇 Permutation,排列问题.这篇博文以几道LeetCode的题目和引用剑指offer上的一道例题入手,小谈一下这种类型题目的解法. 二.上手 最典型的permutation题目是这样的: Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the foll

用试探回溯法解决N皇后问题

学校数据结构的课程实验之一. 数据结构:(其实只用了一个二维数组) 算法:深度优先搜索,试探回溯 需求分析: 设计一个在控制台窗口运行的“n皇后问题”解决方案生成器,要求实现以下功能: 由n*n个方块排成n行n列的正方形称为n元棋盘.如果两个皇后位于n元棋盘上的同一行.同一列或同一对角线上,则称它们在互相攻击.现要找出使棋盘上n个皇后互不攻击的布局. 编制程序解决上述问题,以n=6运行程序,输出结果. 算法解释: 首先试探当前行第一个可用的位置(列.对角线没有被占领),摆放皇后之后,试探下一行的

8.4 智力趣题(2)

8-18 knight2.c 1 #include <stdio.h> 2 typedef struct coord 3 { 4 int x; 5 int y; 6 }Coordinate; //棋盘上的坐标 7 int chessboard[8][8] = { 0 }; //初始化棋盘各单元格状态 8 int curstep; //马跳的步骤序号 9 Coordinate move[8] = { {-2, 1}, {-1, 2}, {1, 2}, {2, 1}, 10 {2, -1}, {1

返回一个二维整数数组中最大子数组的和。

设计思路: 通过之前一维环,进行拓展,成数组. 代码: 1 //XiaoSong Du 2015/4/20 2 #include <iostream> 3 #include <time.h> 4 using namespace std; 5 #define M 3 6 #define N 6 7 8 void main() 9 { 10 int a[M][2*N]={0},b[2*N],d = 0,d1 = 0; 11 int maxd[2*N]={0} ,end1[2*N] =

Arithmetic_Thinking_Dateback

回溯法--是一个很常见的算法求解方式,它主要是把问题所有的解都按照解空间树都列出来,然后只要不符合条件的立马"剪枝",就是回到前面的相应的父节点,将它去除,这种方式有点像父节点生出一些子节点,若是这些子节点都不争气,没办法满足需求,就会将父节点"判刑",因为他也是他父节点中不满足条件的一个子节点,直到根节点,然后又换一个根节点,再来一遍,这种方式就可以用递归来实现 上代码吧,这次解决的是一个比较常见的问题,N皇后问题,我在这里先展示4皇后的解法,更多的思想是一样的

算法回顾--N皇后问题简单回顾

前言 最近学习的过程中,不知道哪门子的思维发散,突然又遇见皇后问题了,于是乎老调重弹,心里琢磨,虽然思路大家都容易懂,哪怕是最简单的野蛮回溯法,说着简单,但是如果非得编码实现?我可以一次性写出来OK的代码吗?我对此表示疑问,于是乎动手写代码,发现写此类算法问题,最重要的是边界条件的判断.这里说明一下,这篇纯属练手,不考虑算法效率,只是为了实现,为了练习最暴力野蛮的回溯,说白了,就是怎样简单粗暴的玩弄for和while这些个玩意! 实现 本人比较懒,所以懒得搞二维数组来存储皇后坐标,其实用二维数组

UVA 10277 Boastin&#39; Red Socks

1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 5 using namespace std; 6 7 unsigned int r,sum,p,q; 8 unsigned int st[50010][2]; 9 10 unsigned gcd(unsigned a,unsigned b) 11 { 12 return b?gcd(b,a%b):a; 13 } 14 /*哈希链表*/ 15 co

Java与算法之(6) - 八皇后问题

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. (文字和图片来自百度百科) 如果动手来摆放皇后,可以用这样一种思路:在最左侧一列放下一个皇后,然后在右边一列从上到下找到第一个与左边皇后不冲突的位置,摆放第二个皇后:再向yo一列,从上到下找到第一个与前两个皇后不冲突的位置摆放第三个皇后,依次类推,直到在最后一列摆下第八个皇后. 认真思考的话,可以发现这仍然是深度优先搜索的思路,即步步推进,下一步做的事情和当前是一样的.代码

Leetcode题解(7)L51/N-Queens

L51: 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 con

温度图显示三维控件

1 OpenFileDialog dlg = new OpenFileDialog(); 2 dlg.Filter = "Result (*.txt)|*.txt|All Files(*.*)|*.*"; 3 4 if (DialogResult.OK != dlg.ShowDialog()) 5 return; 6 7 double[] xdata = { -8.37, -7.87, -7.37, -6.87, -6.37, -5.87, -5.37, -4.87, -4.37, -