回溯——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 ...
随机推荐
- vue.js3 学习笔记 (一)——mixin 混入
vue 2 中采用选项式API.如:data.methods.watch.computed以及生命周期钩子函数等等. mixin 混入,提供了一种非常灵活的方式,来分发 vue 组件中的可复用功能,一 ...
- 【JVM】JVM 概述、内存结构、溢出、调优(基础结构+StringTable+Unsafe+ByteBuffer)
什么是 JVM ? 定义 Java Virtual Machine - java 程序的运行环境(java 二进制字节码的运行环境) 好处 一次编写,到处运行 自动内存管理,垃圾回收功能 数组下标越界 ...
- 关于如何在MyEclipse下修改项目名包名,以及类
1.修改项目名,右键选择properties->web->web-Context-root修改名称或者直接按F2修改.2,修改包名,右键选择Refactor->rename修改名称即 ...
- <C#任务导引教程>练习十
/*83,使用接口完成多继承问题 简化版*/using System;interface ITeacher{ string Name { get; set; ...
- [luogu1737]旷野大计算
- Python学习手册(第四版)——使用入门(自学用)
Python的优点 -可读性 -可移植性 -不是一个独立的工具,可以调用各种库,同时也可以被调用等等 -使编程变得很有趣 -面向对象 -可混合 Python的理念 随便找的一张图 脚本语言? Pyth ...
- 联盛德 HLK-W806 (三): 免按键自动下载和复位
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- C/C++ Qt TableWidget 表格组件应用
TableWidget 表格结构组件,该组件可以看作是TreeWidget树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操 ...
- 在Ubuntu上安装Docker Engine
在Ubuntu上安装Docker Engine 这篇文章是介绍如何在在Ubuntu上安装Docker Engine,就是Google翻译官方文档的版本,英语好的直接官方原文.原文 要在Ubuntu上开 ...
- HDU 5322 Hope
HDU 5322 Hope 考虑 $ dp[n] $ 表示 长度为 $ n $ 的所有排列的答案. 首先,对于一个排列来说,如果最大值在 $ i $ 位置,那么前 $ i - 1 $ 个数必然与 $ ...