N皇后问题的分析和实现

1.实现要求

2.代码实现

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皇后问题的分析和实现的更多相关文章

  1. [HDU 2553]--N皇后问题(回溯)/N皇后问题的分析

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2553 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)     ...

  2. 八皇后问题详细分析与解答(递归法解答,c#语言描述)

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或 ...

  3. n皇后问题(分析)

    这道题需要用到回溯算法,现在在这里先简单的介绍一下这个算法: 回溯算法也叫试探法,它是一种系统地搜索问题的解的方法.回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试.用回溯 ...

  4. 回溯法——n后问题

    问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行 ...

  5. zoj 2778 - Triangular N-Queens Problem

    题目:在三角形的棋盘上放n皇后问题. 分析:找规律题目.依照题目的输出,能够看出构造法则: 先填奇数,后填偶数.以下我们仅仅要证明这样的构造的存在性就可以. 解法:先给出集体构造方法,从(1.n-f( ...

  6. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  7. 7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯

    什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 游戏连接: http://www.4399.com/ ...

  8. 两个NOI题目的启迪8皇后和算24

    论出于什么原因和目的,学习C++已经有一个星期左右,从开始就在做NOI的题目,到现在也没有正式的看<Primer C++>,不过还是受益良多,毕竟C++是一种”低级的高级语言“,而且NOI ...

  9. OpenJudge1700:八皇后问题 //不属于基本法的基本玩意

    1700:八皇后问题//搜索 总时间限制:  10000ms 内存限制:  65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和 ...

  10. 2016HUAS暑假集训题1 H - N皇后问题

    Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对于给定的N,求出有多少种合 ...

随机推荐

  1. mongoDB操作指南

    目录 1. docker安装mongoDB 2. 库-database 3. 集合-collection 3.1 命名规范 3.2 增-createCollection 3.3 删-drop 4. 文 ...

  2. Java工作环境的配置与Eclipse的安装

    如果您觉得这篇文章有用,请点个赞呀! Eclipse是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.Eclipse 附带了一个标 ...

  3. C 语言版线程池

    一.初始线程池 1.1 何为线程池? 我们先来打个比方,线程池就好像一个工具箱,我们每次需要拧螺丝的时候都要从工具箱里面取出一个螺丝刀来.有时候需要取出一个来拧,有时候螺丝多的时候需要多个人取出多个来 ...

  4. Linux 阶段二

    1.2 安装JDK JDK具体安装步骤如下: 1). 上传安装包 使用FinalShell自带的上传工具将jdk的二进制发布包上传到Linux 由于上述在进行文件上传时,选择的上传目录为根目录 /,上 ...

  5. 人工智能AI图像风格迁移(StyleTransfer),基于双层ControlNet(Python3.10)

    图像风格迁移(Style Transfer)是一种计算机视觉技术,旨在将一幅图像的风格应用到另一幅图像上,从而生成一幅新图像,该新图像结合了两幅原始图像的特点,目的是达到一种风格化叠加的效果,本次我们 ...

  6. 【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常

    学习Spring源码的建议 阅读Spring官方文档,了解Spring框架的基本概念和使用方法. 下载Spring源码,可以从官网或者GitHub上获取. 阅读Spring源码的入口类,了解Sprin ...

  7. Mac M1(arm 系列芯片)如何安装 Chromium | Puppeteer

    最近写个脚本用到 puppeteer,然后安装 Chromium 出现一点问题,这里记录一下解决方案. Puppeteer 自动安装失败 在 Puppeteer 安装时会自动安装 Chromium,然 ...

  8. Centos7.x 安装jenkins

    一.安装 前提:需查看是否安装了JDK 1.第一种方法 sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat ...

  9. Web服务器压力测试工具 - HULK

    HULK是一种web的拒绝服务攻击工具.它能够在web服务器上产生许多单一的伪造流量,能绕开引擎的缓存,因此能够直接攻击服务器的资源池.hulk的特别之处在于:对于每一个请求都是独特的,能够绕开引擎的 ...

  10. SQL Server数据库判断最近一次的备份执行结果

    1 麻烦的地方 在SQL Server的官方文档里面可以看到备份和还原的表,但是这些表里面只能找到备份成功的相关信息,无法找到备份失败的记录,比如msdb.dbo.backupset.对于一些监控系统 ...