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,求出有多少种合 ...
随机推荐
- LeetCode 周赛 340,质数 / 前缀和 / 极大化最小值 / 最短路 / 平衡二叉树
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 大家好,我是小彭. 上周跟大家讲到小彭文章风格的问题,和一些朋友聊过以后,至少在算法题解方面确定了小彭的风格 ...
- WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?
本文将介绍 Wasm,以及 Apache APISIX 如何实现 Wasm 功能. 作者朱欣欣,API7.ai 技术工程师 原文链接 什么是 Wasm Wasm 是 WebAssembly 的缩写.W ...
- Node + Express 后台开发 —— 起步
Node + Express 后台开发 -- 起步 前面陆续学习了一下 node.npm.模块,也稍尝试 Express,感觉得换一个思路加快进行. 比如笔者对前端的开发已较熟悉,如果领导给一个内部小 ...
- javasec(五)URLDNS反序列化分析
这篇文章介绍 URLDNS 就是ysoserial中⼀个利⽤链的名字,但准确来说,这个其实不能称作"利⽤链".因为其参数不是⼀个可以"利⽤"的命令,⽽仅为⼀个U ...
- 安装node并创建vue项目
1.多版本管理工具 nvm https://github.com/coreybutler/nvm-windows/releases nvm-setup.zip 2. 打开nvm文件夹下的setting ...
- Django 如何使用 Celery 完成异步任务或定时任务
以前版本的 Celery 需要一个单独的库(django-celery)才能与 Django 一起工作, 但从 Celery 3.1 开始,情况便不再如此,我们可以直接通过 Celery 库来完成在 ...
- Appweb交叉编译
Appweb交叉编译 编译环境:ubuntu-12.04 x64 开发平台:Hi3535 arm版 编译版本:appweb-6.1.1.zip 下载地址=> Appweb web site: h ...
- 快速求popcount的和
前置知识 \(\text{popcount}(n)\) 表示将 \(n\) 转为二进制后的数中 \(1\) 的个数. 结论 \[\sum_{i=1}^{n} \text{ popcount}(i)=\ ...
- 如何在 🤗 Space 上托管 Unity 游戏
你知道吗?Hugging Face Space 可以托管自己开发的 Unity 游戏!惊不惊喜,意不意外?来了解一下吧! Hugging Face Space 是一个能够以简单的方式来构建.托管和分享 ...
- Linux 升级sudo到 1.9.12p1,解决漏洞CVE-2022-43995
一.查看sudo版本 sudo -V 二.下载最新版本到服务器并解压 wget https://www.sudo.ws/dist/sudo-1.9.12p1.tar.gz && tar ...