Leetcode | N-Queens I & II
N-Queens I
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.."]
]
Wiki:任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。
回溯,用了一个数组col[i]来表示第i列是不是已经放了queen。
对于(row1, col1)和(row2, col2)这两个位置,如果它们在同一对角线上,那么有abs(row1-row2) = abs(col1-col2)。
class Solution {
public:
vector<vector<string> > solveNQueens(int n) {
if (n == || n == ) {
return ret;
}
vector<string> sol(n, string(n, '.'));
vector<bool> col(n, false);
bt(n, , col, sol);
return ret;
}
void bt(int n, int r, vector<bool> &col, vector<string> &sol) {
if (r >= n) {
ret.push_back(sol);
return;
}
for (int i = ; i < n; ++i) {
if (col[i]) continue;
bool diag = false;
for (int j = r - ; j >= ; --j) {
for (int m = ; m < n; ++m) {
if (abs(j - r) == abs(m - i) && sol[j][m] == 'Q') {
diag = true;
break;
}
}
}
if (!diag) {
col[i] = true;
sol[r][i] = 'Q';
bt(n, r + , col, sol);
col[i] = false;
sol[r][i] = '.';
}
}
}
private:
vector<vector<string> > ret;
};
N-Queens II
Follow up for N-Queens problem.
Now, instead outputting board configurations, return the total number of distinct solutions.
和N-Queens I 类似,同样需要回溯。
前面回溯的时候需要用到一个额外的数组col[i],而且用到了sol这个数组来判断对角线元素。
网上的解决方案更巧妙些,用到一个数组sol[i],存的是第i行可解的列号。
当处理到第r行时,检查前r-1行,看sol[0...r-1]有没有等于i的,有就代表了该列已经有queen了。然后再检查对角线上的。
class Solution {
public:
int totalNQueens(int n) {
if (n == || n == ) {
return ;
}
vector<int> sol(n, -);
total = ;
bt(n, , sol);
return total;
}
void bt(int n, int r, vector<int> &sol) {
if (r >= n) {
total++;
return;
}
for (int i = ; i < n; ++i) {
bool valid = true;
for (int j = r - ; j >= ; --j) {
for (int m = ; m < n; ++m) {
if (sol[j] == i || abs(j - r) == abs(sol[j] - i)) {
valid = false;
break;
}
}
}
if (valid) {
int t = sol[r];
sol[r] = i;
bt(n, r + , sol);
sol[r] = t;
}
}
}
private:
int total;
};
第三次写,在返回值统计。至此leetcode三遍刷完。
class Solution {
public:
int totalNQueens(int n) {
if (n <= ) return ;
vector<int> colSetted(n, -);
return recurse(n, , colSetted);
}
int recurse(int n, int row, vector<int> &colSetted) {
if (row >= n) {
return ;
}
int count = ;
for (int i = ; i < n; ++i) {
if (colSetted[i] == -) {
bool couldSet = true;
for (int j = ; j < n; ++j) {
if (colSetted[j] != - && abs(row - colSetted[j]) == abs(i - j)) {
couldSet = false;
break;
}
}
if (couldSet) {
colSetted[i] = row;
count += recurse(n, row + , colSetted);
colSetted[i] = -;
}
}
}
return count;
}
};
Leetcode | N-Queens I & II的更多相关文章
- LeetCode Single Number I / II / III
[1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- LeetCode:路径总和II【113】
LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...
- LeetCode:组合总数II【40】
LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...
- [Leetcode] n queens ii n皇后问题
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- [Leetcode][Python]52: N-Queens II
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 52: N-Queens IIhttps://oj.leetcode.com/ ...
- [LeetCode] Number of Islands II 岛屿的数量之二
A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...
- LeetCode:Word Ladder I II
其他LeetCode题目欢迎访问:LeetCode结题报告索引 LeetCode:Word Ladder Given two words (start and end), and a dictiona ...
- LeetCode:Path Sum I II
LeetCode:Path Sum Given a binary tree and a sum, determine if the tree has a root-to-leaf path such ...
随机推荐
- Java for LeetCode 063 Unique Paths II
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- [产品相关] A/B测试终极指南(翻译)
转载地址: http://blog.sina.com.cn/s/blog_9149268d0100zrx7.html 还记得以前导师说看了英文的文章就把它翻译一下吧,这样会对文章更好地理解,也会有更深 ...
- Session的使用(登录例案+其它页面访问)
本程序功能是使用Session将用户输入的用户名保存在Session中(登录成功情况下,登录失败不会有Session值),其它页面想访问时会先判断是否有之前存的Session值. 登录Login.ht ...
- icon上添加数字提醒
使用viewbadger包: package com.jingle.vierbagerstudy; import android.app.Activity; import android.os.Bun ...
- date +%s 能打印出自1970-01-01 00:00:00到当前时间的秒数
[root@bass Desktop]# date +%s 1466561580 [root@bass Desktop]# python Python 2.6.6 (r266:84292, Jul 2 ...
- SVN服务器搭建和使用(三)(转载)
转载地址:http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html 接下来,试试用TortoiseSVN修改文件,添加文件, ...
- 关于MFC监听器的相关了解
最近有个项目,所搭框架为了减少耦合,希望MainFrame中View不依赖于Mainframe,即MainFrame中含有view类而view中不会包含MainFrame的相关信息. 现在遇到一个问题 ...
- Codeforces Round #352 (Div. 2) D. Robin Hood 二分
D. Robin Hood We all know the impressive story of Robin Hood. Robin Hood uses his archery skills a ...
- 在MongoDB中使用JOIN操作
SQL与NoSQL最大的不同之一就是不支持JOIN,在传统的数据库中,SQL JOIN子句允许你使用普通的字段,在两个或者是更多表中的组合表中的每行数据.例如,如果你有表books和publisher ...
- Windbg 双机代码同步调试设置
Windbg的设置 Windbg的设置 Windbg本身可以直接从微软的网站上下载下载地址:http://www.microsoft.com/whdc/devtools/debugging/defau ...