回溯——51. N皇后
这一题在我刚开始拿到的时候,是一点思路都没有的,只能先分析题目的要求,即queen之间的规则:
- 不能同行
- 不能同列
- 不能同斜线
- 不能同左斜
- 不能同右斜
同时发现,在寻找所有可能结果的穷举过程中,传入的参数并不需要以整个“棋盘”的形式,只需要传入之前确定的所有queen的位置即可。
这样就可以先写下,在遍历每个潜在的位置合法性的判断函数,同时确定回溯时使用的重要的数据格式:
//coordinateXY[i]:第i个点的横纵坐标
//coordinateXY[i][0]——横坐标
//coordinateXY[i][1]——纵坐标
int[][] coordinateXY = new int[n][2]; //x1 y1 是需要判断的是否合法的坐标
private boolean validXY(int x1, int y1, int[][] coordinateXY) {
int x2 = -1, y2 = -1;
for (int i = 0; i < n && coordinateXY[i][1] != -1; ++i) {
x2 = coordinateXY[i][0];
y2 = coordinateXY[i][1];
// 同列 || 同左斜 || 同右斜
if ((y1 == y2) || (x1+y1 == x2+y2) || (x1-x2 == y1-y2)) {
return false;
}
}
return true;
}
回溯时记录结果的数据格式coordinateXY确定了,自然可以确定最终结果集的构造:
List<List<String>> result = new ArrayList<>();
//构造返回值
private List<String> print(int[][] coordinateXY) {
List<String> ans = new ArrayList<>();
StringBuilder sb = null;
int y = -1;
for (int[] xy : coordinateXY) {
sb = new StringBuilder();
y = xy[1];
for (int i = 0; i < n; ++i) {
//三元表达式代替if-else
sb.append((i == y) ? "Q" : ".");
}
ans.add(sb.toString());
}
return ans;
}
最后根据回溯三部曲,确定下回溯函数:
//x:当前的第x个queen,也是这个queen所在的横坐标的值
private void function(int x, int[][] coordinateXY) {
//如果x==n,证明0~n-1个queen都已经确定了坐标,即可记录下此结果
if (x == n) {
result.add(print(coordinateXY));
return ;
} //对于当前这个第x个queen,横坐标coordinateXY[x][0] == x
//只要从0 ~ n-1寻找合法的y即可
for (int y = 0; y < n; ++y) {
if (validXY(x, y, coordinateXY)) {
//记录下合法的坐标
coordinateXY[x][1] = y;
//将第x个queen的纵坐标加入path(coordinateXY),递归的寻找第x+1个queen的所有合法的纵坐标
function(x+1, (int[][]) coordinateXY.clone());
//删除本次记录,继续寻找下一个可能的y
coordinateXY[x][1] = -1;
}
}
}
这题的关键点主要在:
- 确定记录结果的数据结构
- 确定validXY函数
- 根据queen不能在同一行,确定下回溯是按照行向下遍历的逻辑
回溯——51. N皇后的更多相关文章
- Leetcode之回溯法专题-51. N皇后(N-Queens)
Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...
- Java实现 LeetCode 51 N皇后
51. N皇后 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决 ...
- 【回溯】n皇后问题
问题 U: [回溯]n皇后问题 时间限制: 1 Sec 内存限制: 128 MB提交: 4 解决: 4[提交][状态][讨论版] 题目描述 在一个国际象棋棋盘上,放置n个皇后(n<10),使 ...
- 回溯算法————n皇后、素数串
回溯就是算法是搜索算法中一种控制策略,是一个逐个试探的过程.在试探的过程中,如果遇到错误的选择,就会回到上一步继续选择下一种走法,一步一步的进行直到找到解或者证明无解为止. 如下是一个经典回溯问题n皇 ...
- 回溯算法 - n 皇后问题
(1)问题描述 在 n × n 格的棋盘上放置彼此不受攻击的 n 个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n 后问题等价于在 n × n 的棋盘上放置 n 个 ...
- leetcode 51. N皇后 及 52.N皇后 II
51. N皇后 问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后 ...
- ACM:回溯,八皇后问题,素数环
(一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...
- 【Python】生成器、回溯和八皇后问题
八皇后问题: 把N个皇后,放在N*N的棋盘上面,从第一行往下放,每个皇后占一行,同时,每个皇后不能处在同一列,对角线上,有多少种放置方法. 思路: 典型的回溯问题: 1.当要放置最后一个皇后时候,默认 ...
- LeetCode 51. N-QueensN皇后 (C++)(八皇后问题)
题目: The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two que ...
随机推荐
- Java_map
1 package Test; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class MapTest { 7 p ...
- 一文理解Java-class字节码文件
前言 java语言在其刚诞生之际喊出的口号--"Write Once,Run Anywhere",正是基于字节码(byte code)而存在的,java能够做到平台无关性,得力于这 ...
- 统计学习1:朴素贝叶斯模型(Numpy实现)
模型 生成模型介绍 我们定义样本空间为\(\mathcal{X} \subseteq \mathbb{R}^n\),输出空间为\(\mathcal{Y} = \{c_1, c_2, ..., c_K\ ...
- CF605E Intergalaxy Trips
CF605E Intergalaxy Trips 考虑你是不知道后来的边的出现情况的,所以可以这样做:每天你都选择一些点进行观察,知道某天往这些点里面的某条边可用了,你就往这条边走.这样贪心总是对的. ...
- Codeforces 1299D - Around the World(线性基+图论+dp)
Codeforces 题目传送门 & 洛谷题目传送门 一道线性基的综合题 %%%%%% 首先注意到"非简单路径""异或和"等字眼,可以本能地想到线性基. ...
- 洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)
题面传送门 一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的( 首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S)) ...
- Oracle——检查数据库是否正常运行,如果没有,并重启数据库
1.su oracle 切换到linux的oracle账号 需要使用 su -oracle,而不是su oracle;原因是: 先执行exit退出,再重新切换 2.打开数据库监听 lsnrctl l ...
- 暂时lvs
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- linux 网络配置管理
[1]网络配置基础 (1)用户既可以通过命令行的方式,也可以通过友好的图形界面,轻松完成网络配置. (2)实现Linux网络配置的惟一目标就是修改系统中众多的网络配置文件, 如/etc/interfa ...
- mysql 计算日期为当年第几季度
select T21620.日期 as F21634, QUARTER('98-04-01') as quarter #返回日期是一年的第几个季度 - ...