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,求出有多少种合 ...
随机推荐
- 手动编写Swagger文档与部署指南
Swagger介绍 在Web开发中,后端开发者在完成接口开发后,需要给前端相应的接口使用说明,所以一般会写一份API文档.一般来说,有两种方式提供API接口文档,一种是利用插件在代码中自动生成,另一种 ...
- 23.04.06_为博客设置https
title: 为博客设置https协议 categories: - 博客优化 date: 2023-04-06 url_dir: Blog_optimization url_name: setting ...
- 最新版本 Stable Diffusion 开源 AI 绘画工具之中文自动提词篇
目录 标签生成器 提示词自动补全 标签生成器 由于输入正向提示词 prompt 和反向提示词 negative prompt 都是使用英文,所以对学习母语的我们非常不友好 使用网址:https://t ...
- 微信小程序隐藏页面滚动条
开发小程序时,经常会碰到页面长度超过屏幕高度,然后下拉时会出现滚动条,对于一些有强迫症的人来说是不可忍受的. 网上看了好多,写的.都评论有起作用或者不起作用的. 我在这分享一个全局隐藏滚动条的方式. ...
- oracle逻辑备份exp导出指定表名时需要加括号吗?
Oracle 的exp.imp.expdp.impdp命令用于数据库逻辑备份与恢复; exp命令用于把数据从远程数据库server导出至本地,生成dmp文件. 笔者在实操中遇到: $exp user/ ...
- Linux安装Net7SDK运行Net项目
Linux安装Net7SDK运行Net项目 安装Net7 SDK 1.安装sdk依赖环境 wget https://packages.microsoft.com/config/ubuntu/20.04 ...
- Nginx常用配置及和基本功能讲解
作者:京东物流 殷世杰 Nginx已经广泛应用于J-one和Jdos的环境部署上,本文对Nginx的常用的配置和基本功能进行讲解,适合Nginx入门学习. 1 核心配置 找到Nginx安装目录下的co ...
- 2021-11-04:计算右侧小于当前元素的个数。给你`一个整数数组 nums ,按要求返回一个新数组 counts 。数组 counts 有该性质: counts[i] 的值是 nums[i] 右
2021-11-04:计算右侧小于当前元素的个数.给你`一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧 ...
- openstack部署2
检查服务,查看dashboard页面有哪些功能 检查服务状态 检查计算节点,控制节点服务是up状态 检查网络节点是True的状态.这里的每个计算节点,都是一个neutron的客户端. 查看dashbo ...
- Netty实战(五)
一.什么是ByteBuf 我们前面说过,网络数据的基本单位总是字节.Java NIO 提供了 ByteBuffer 作为它的字节容器,但是这个类使用起来过于复杂,而且也有些繁琐.ByteBuffer ...