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的更多相关文章

  1. LeetCode Single Number I / II / III

    [1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...

  2. [array] leetcode - 40. Combination Sum II - Medium

    leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...

  3. LeetCode 137. Single Number II(只出现一次的数字 II)

    LeetCode 137. Single Number II(只出现一次的数字 II)

  4. LeetCode:路径总和II【113】

    LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...

  5. LeetCode:组合总数II【40】

    LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...

  6. [Leetcode] n queens ii n皇后问题

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  7. [Leetcode][Python]52: N-Queens II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 52: N-Queens IIhttps://oj.leetcode.com/ ...

  8. [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 ...

  9. LeetCode:Word Ladder I II

    其他LeetCode题目欢迎访问:LeetCode结题报告索引 LeetCode:Word Ladder Given two words (start and end), and a dictiona ...

  10. 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 ...

随机推荐

  1. 【JAVA、C++】LeetCode 012 Integer to Roman

    Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...

  2. 17.Python笔记之memcached&redis

    作者:刘耀 博客:www.liuyao.me 博客园:www.cnblogs.com/liu-yao 一.Memcached 1.介绍 Memcached 是一个高性能的分布式内存对象缓存系统,用于动 ...

  3. byte[]和InputStream的相互转换[转载]

    1:byte[]转换为InputStream InputStream sbs = new ByteArrayInputStream(byte[] buf); 2:InputStream转换为Input ...

  4. springJDBC一对多关系,以及Java递归,jsp递归的实现

    maven编译,springMVC+spring+springJDBC框架. 要实现的功能是一个文件夹下,可能显示n个文件夹,每个文件夹下又可能显示n个文件夹.... 前台效果:

  5. ***mysql中经度纬度字段用什么存储(关于mysql的float和decimal区别)

    float,decimal精确度比较   float,double容易产生误差,对精确度要求比较高时,建议使用decimal来存,decimal在mysql内存是以字符串存储的, 用于定义货币要求精确 ...

  6. poj 2926:Requirements(最远曼哈顿距离,入门题)

    Requirements Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 3908   Accepted: 1318 Desc ...

  7. z-index属性

    在使用z-index这个属性之前,我们必须先了解使用z-index的必要条件: .要想给元素设置z-index样式,必须先让它变成定位元素,说的明白一点,就是要给元素设置一个postion:relat ...

  8. 微信聊天测试脚本 wx_sample.php

    <?php </FuncFlag>                             </xml>);         curl_setopt($ch, CURLO ...

  9. AppInventor学习笔记(四)——打地鼠应用学习

    一.组件设计 1.整体预览 2.图片精灵的添加 (1)首先加入一个画布进去 调节属性如图 (2)添加精灵 添加精灵,然后上传张图片进行属性修改 3.加入Clock 直接加入,设定为1000ms 二.B ...

  10. Excel文件导入SQL Server数据库表

    --office 2003--如果接受数据导入的表已经存在insert into DemoTable select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0 ...