n皇后问题的分析和实现
N皇后问题的分析和实现
1.实现要求
在n*n的方格棋中,放置n个皇后,要求每个皇后不同行,不同列,不同对角线
以行为依据,遍历行,判断行对应的列是否符合要求
判定要求:
1.当列被占用,返回false
if(next==clo.get(i)) return false;
//next表示传入的列,col.get(i)表示当前行对应的列,两者相等表示同列,返回false
2.当对角线被占用,返回false
if (Math.abs(i - row) == Math.abs(next - col.get(i))) return false;
//对角线分为两类,左上和左下
获取对应n*n方格棋符合要求的集合,运用遍历,获取方格棋的排列
2.代码实现
运用集合存储数据
package com.prettyspider.Action;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class NQueens {
public static void main(String[] args) {
/**
* n皇后问题
* 在同一行,同一列,对角线上不能有超过一个的元素
*
* 需要随机的添加元素,因此要使用集合,每次产生的结果是对应列所在行的值相等
*/
//1.获取键盘录入对象
Scanner scanner = new Scanner(System.in);
//2.录入数据
int n = scanner.nextInt();
//3.调用函数
List<List<String>> listList = solveNqueen(n);
System.out.println(listList.size());
}
private static List<List<String>> solveNqueen(int n) {
//3.1创建结果对象
List<List<String>> result = new ArrayList<>();
//3.2对输入值进行判断
if (n <= 0) {
return result;
}
//4调用搜索函数
search(n, new ArrayList<Integer>(), result);
return result;
}
private static void search(int n, ArrayList<Integer> col, List<List<String>> result) {
//4.1判断是否搜索完
if (n == col.size()) {
//6. 调用绘制结果函数
result.add(drawChessBoard(col));
return;
}
//4.2遍历获取符合标准的集合
for (int i = 0; i < n; i++) { //比较行
//5.判断是否符合要求
if (!isValid(col, i)) {
continue;
}
//4.3 不满足要求,向col中添加数据
col.add(i);
//4.4 递归调用search,查找下一个不符合要求的位点
search(n, col, result);
//4.5 在每次执行4.1后会进行回溯,此时要将添加的数据删除,便于下一个符合中体要求的集合的添加 要从最后添加的数据开始删除数据
col.remove(col.size() - 1);
}
}
private static boolean isValid(ArrayList<Integer> col, int next) {
//5.1获取行数
int row = col.size();
//排除错误情况
for (int i = 0; i < row; i++) {
//5.2判断col存储行所对应的列与输入的next是否相等 比较列
if (next == col.get(i)) {
return false;
}
if (Math.abs(i - row) == Math.abs(next - col.get(i))) {
return false;
}
//5.3判断当输入的数据小于col对应的列 与i和col相减对应的数据相等,即左上角
// if (i - row == next - col.get(i)) {
// return false;
// }
// //5.4 判断当输入的数据大于col对应的列 与i和col相减对应的数据相等,即右上角
// if (i - row == col.get(i) - next) {
// return false;
// }
}
return true;
}
private static ArrayList<String> drawChessBoard(ArrayList<Integer> col) {
//6.1创建绘图集合duixaing
ArrayList<String> chessBoard = new ArrayList<>();
//列
for (int i = 0; i < col.size(); i++) {
String row = "";
//行
for (int j = 0; j < col.size(); j++) {
if (col.get(j) == i) {
row += "q";
} else {
row += ",";
}
}
chessBoard.add(row);
}
return chessBoard;
}
}
如果想要更好的展示每一次的结果,可以使用字符串拼接或使用StringBuilder类,将每次的结果输出
n皇后问题的分析和实现的更多相关文章
- [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others) ...
- 八皇后问题详细分析与解答(递归法解答,c#语言描述)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或 ...
- n皇后问题(分析)
这道题需要用到回溯算法,现在在这里先简单的介绍一下这个算法: 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试.用回溯 ...
- 回溯法——n后问题
问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行 ...
- zoj 2778 - Triangular N-Queens Problem
题目:在三角形的棋盘上放n皇后问题. 分析:找规律题目.依照题目的输出,能够看出构造法则: 先填奇数,后填偶数.以下我们仅仅要证明这样的构造的存在性就可以. 解法:先给出集体构造方法,从(1.n-f( ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- 7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯
什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 游戏连接: http://www.4399.com/ ...
- 两个NOI题目的启迪8皇后和算24
论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看<Primer C++>,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI ...
- OpenJudge1700:八皇后问题 //不属于基本法的基本玩意
1700:八皇后问题//搜索 总时间限制: 10000ms 内存限制: 65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和 ...
- 2016HUAS暑假集训题1 H - N皇后问题
Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合 ...
随机推荐
- day08 元组字典集合
day08 元组 集合 字典 元组 """ 小括号括起来,内部存放多个元素,元组之间逗号隔开,元素不可改变,元素类型不能是任意的, """ ...
- go-easy-utils 2.0 正式发布,全面支持泛型和any
介绍 这是一个基于 Go 语言开发的通用数据类型处理工具类,帮助开发者在业务代码实现中处理常见的数据类型和数据操作.可以让您专注于您的业务代码的实现,而免去处理基本数据类型转换和验证的功能.该工具库无 ...
- React中图片的相对路径引入和绝对路径引入
React中当在JSX中的img标签中引入时使用相对路径引入,地址是基于index.html的而不是当前jsx文件的,如 <img src="./src/assets/images/g ...
- 批量上传iOS应用程序截图的实用技巧
提交iOS应用程序截图到iTunes Connect是一项非常繁琐的任务,因为你必须上传多达数十张屏幕截图,这是一个重复而枯燥的过程.但是,我们有一个好消息要告诉开发者们,现在有一个工具可以帮助你 ...
- 【FAQ】统一扫码服务常见问题及解答
1.隐私政策是怎么样的?收集哪些信息? 关于Scan Kit的隐私政策及收集的信息,请查看SDK隐私安全说明. Android:SDK隐私安全说明 iOS:SDK隐私安全说明 2.如何使用多码识别?多 ...
- 业务系统对接CAS
启动类加@EnableCasClient <!--cas客户端--> <dependency> <groupId>net.unicon.cas</groupI ...
- API网关:开源Apinto网关-上游服务篇(二)
功能介绍 服务发现是一种分布式系统中的关键技术,它能够帮助应用程序动态地发现和访问依赖的服务实例,解决了服务实例分布在不同节点上的问题.通过服务发现,应用程序可以快速找到需要调用的服务实例的位置和元数 ...
- 使用扩展函数方式,在Winform界面中快捷的绑定树形列表TreeList控件和TreeListLookUpEdit控件
在一些字典绑定中,往往为了方便展示详细数据,需要把一些结构树展现在树列表TreeList控件中或者下拉列表的树形控件TreeListLookUpEdit控件中,为了快速的处理数据的绑定操作,比较每次使 ...
- ES6必会重点汇总
当下的前端开发已经成为一项非常流行的技能.在这个领域中,ES6是一个重要的主题.ES6是ECMAScript 2015的缩写,是JavaScript语言的下一个版本,引入了很多新的语言特性和API,让 ...
- FreeSWITCH使用L16编码通信及raw数据提取
环境:CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Python版本:3.9.12 一.背景描述 PCM(Pulse Code Modulation,脉冲编码调制)音频数据是 ...