这一题在我刚开始拿到的时候,是一点思路都没有的,只能先分析题目的要求,即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皇后的更多相关文章

  1. Leetcode之回溯法专题-51. N皇后(N-Queens)

    Leetcode之回溯法专题-51. N皇后(N-Queens) n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给 ...

  2. Java实现 LeetCode 51 N皇后

    51. N皇后 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后问题的解决 ...

  3. 【回溯】n皇后问题

    问题 U: [回溯]n皇后问题 时间限制: 1 Sec  内存限制: 128 MB提交: 4  解决: 4[提交][状态][讨论版] 题目描述 在一个国际象棋棋盘上,放置n个皇后(n<10),使 ...

  4. 回溯算法————n皇后、素数串

    回溯就是算法是搜索算法中一种控制策略,是一个逐个试探的过程.在试探的过程中,如果遇到错误的选择,就会回到上一步继续选择下一种走法,一步一步的进行直到找到解或者证明无解为止. 如下是一个经典回溯问题n皇 ...

  5. 回溯算法 - n 皇后问题

    (1)问题描述 在 n × n 格的棋盘上放置彼此不受攻击的 n 个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n 后问题等价于在 n × n 的棋盘上放置 n 个 ...

  6. leetcode 51. N皇后 及 52.N皇后 II

    51. N皇后 问题描述 n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n 皇后 ...

  7. ACM:回溯,八皇后问题,素数环

    (一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...

  8. 【Python】生成器、回溯和八皇后问题

    八皇后问题: 把N个皇后,放在N*N的棋盘上面,从第一行往下放,每个皇后占一行,同时,每个皇后不能处在同一列,对角线上,有多少种放置方法. 思路: 典型的回溯问题: 1.当要放置最后一个皇后时候,默认 ...

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

随机推荐

  1. Java_map

    1 package Test; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 public class MapTest { 7 p ...

  2. 一文理解Java-class字节码文件

    前言 java语言在其刚诞生之际喊出的口号--"Write Once,Run Anywhere",正是基于字节码(byte code)而存在的,java能够做到平台无关性,得力于这 ...

  3. 统计学习1:朴素贝叶斯模型(Numpy实现)

    模型 生成模型介绍 我们定义样本空间为\(\mathcal{X} \subseteq \mathbb{R}^n\),输出空间为\(\mathcal{Y} = \{c_1, c_2, ..., c_K\ ...

  4. CF605E Intergalaxy Trips

    CF605E Intergalaxy Trips 考虑你是不知道后来的边的出现情况的,所以可以这样做:每天你都选择一些点进行观察,知道某天往这些点里面的某条边可用了,你就往这条边走.这样贪心总是对的. ...

  5. Codeforces 1299D - Around the World(线性基+图论+dp)

    Codeforces 题目传送门 & 洛谷题目传送门 一道线性基的综合题 %%%%%% 首先注意到"非简单路径""异或和"等字眼,可以本能地想到线性基. ...

  6. 洛谷 P5643 - [PKUWC2018]随机游走(Min-Max 容斥+FWT+树上高斯消元,hot tea)

    题面传送门 一道挺综合的 hot tea,放到 PKUWC 的 D2T2 还挺喜闻乐见的( 首先我们考虑怎样对一个固定的集合 \(S\) 计算答案,注意到我们要求的是一个形如 \(E(\max(S)) ...

  7. Oracle——检查数据库是否正常运行,如果没有,并重启数据库

    1.su oracle  切换到linux的oracle账号 需要使用 su -oracle,而不是su oracle;原因是: 先执行exit退出,再重新切换 2.打开数据库监听 lsnrctl l ...

  8. 暂时lvs

    负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...

  9. linux 网络配置管理

    [1]网络配置基础 (1)用户既可以通过命令行的方式,也可以通过友好的图形界面,轻松完成网络配置. (2)实现Linux网络配置的惟一目标就是修改系统中众多的网络配置文件, 如/etc/interfa ...

  10. mysql 计算日期为当年第几季度

    select T21620.日期 as F21634, QUARTER('98-04-01')  as quarter                       #返回日期是一年的第几个季度   - ...