这一题在我刚开始拿到的时候,是一点思路都没有的,只能先分析题目的要求,即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. IO流(二)

    一:字符流 字符输入流 写入文件字符流 import java.io.FileWriter; import java.io.IOException; //fileWriter public class ...

  2. SpringBoot Actuator — 埋点和监控

    项目中看到了有埋点监控.报表.日志分析,有点兴趣想慢慢捣鼓一下 1. 数据埋点 监控机器环境的性能和业务流程或逻辑等各项数据,并根据这些数据生成对应的指标,那么我们就称为数据埋点.比如我们想知道某个接 ...

  3. 【ASP.NET Core】体验一下 Mini Web API

    在上一篇水文中,老周给大伙伴们简单演示了通过 Socket 编程的方式控制 MPD (在树莓派上).按照计划,老周还想给大伙伴们演示一下使用 Web API 来封装对 MPD 控制.思路很 Easy, ...

  4. .NET Protobuf包装器库

    Wodsoft Protobuf Wrapper 内容 关于 需求 安装 用法 序列化 反序列化 字段定义 字段排序 非空构造函数对象 获取Protobuf包装器 高级 支持的属性类型与Protobu ...

  5. [loj3274]变色龙之恋

    首先有一个暴力的做法,将任意两个点判断,可以得到与之相关的1或3只变色龙:1只是两只变色龙相互喜欢,那么剩下那只就是颜色相同:3只从3只选2只并和自己判断一次,结果为1的那次剩下的那个就是他喜欢的,然 ...

  6. 从一个小Bug,到Azure DevOps

    1. 一个小Bug 最近和同事提起一个几年前的 Bug,那是一个很小很小的 Bug,没什么技术含量.那时候我刚入职,正好公司卖了一款仪器到某个国家,但是那边说配套的软件运行不起来,一打开就报错.经过排 ...

  7. [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础

    [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 目录 [源码解析] PyTorch 分布式 Autograd (2) ---- RPC基础 0x00 摘要 0x0 ...

  8. vue项目中使用 SheetJS / js-xlsx 导出文件

    1.  npm install xlsx 2. 在App.vue 中引入xlsx import * as XLSX from 'xlsx'; // 数据导出导入所需要的依赖  3.  使用xlsx 3 ...

  9. 洛谷 P5853 - [USACO19DEC]Tree Depth P(生成函数+背包)

    洛谷题面传送门 神仙题. 首先考虑一个点的深度是什么,注意到对于笛卡尔树而言直接从序列的角度计算一个点的深度是不容易的,因为这样会牵扯到序列中多个元素,需要 fixed 的东西太多,计算起来太复杂了. ...

  10. js ajax 请求

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...