八皇后问题(:java实现

开始搞算法!

文章目录

  • 一、问题描述
  • 二、最简单的思路
  • 三、Java实现
  • 四、总结反思


一、问题描述

八皇后问题是一个古老而著名的问题,由国际象棋棋手马克斯·贝瑟尔于1848年提出,它是回溯算法的典型案例。问题要求在8×8的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

二、最简单的思路

从第一行开始选择一个位置(通常从第一列开始)放置第一个皇后
然后从第二行选取一个不冲突的位置放置第二个皇后,以此类推
当放置时已经没有合适位置,则将上一个皇后换到下一个合适的位置,然后继续放置
直到所有的皇后放置完毕。

三、Java实现

我们可以使用一个一维数组,下标表示行数,对应的值为该行放置皇后的列数。
以八皇后为例:我们可以定义一个长度为8的一维数组。
注释已经写的相当详细了。

public class EightQueens {//问题的规模private int n = 8;//用来记录皇后的位置private  int[] queens = new int[n];//用来计算解的个数private int count = 0;public int getCount() {return count;}public EightQueens(){}public EightQueens(int n){this.n = n;this.queens = new int[n];}//这个返回值,是由讲究的,因为要递归//输入参数的就是当前行数public boolean solve(int i){//开始解决问题 首先解决跳出条件,那就是放完第n个,这时候是该放n+1个,但是计算机是从0开始的if(i == n){//可以展示一下了,都放完了,同时解法的计数加一count += 1;//用来绘制结果,也可以保存一下当前的queens数组printQueens();//return true;// 如果只需要找到一个解,那么这里就可以返回true,// 这里不返回的话,会顺着往下走,认为这个结果不对,然后返回false回溯}//如果没有全部放好的话,那么就要开始从第(0)一列开始尝试放置for (int j = 0; j < n; j++) {//这里写了一个辅助函数判断当前位置可不可以。if(isValid(i,j)){//如果可以的话,就在这一行的这列放下皇后queens[i] = j;//然后递归调用,判断后面的是不是可以放if(solve(i+1)){//可以放就返回truereturn true;}//注意这里后面没有正确放置的话,是进入下一列去判断的,不是返回false哦//也就是说在这个阶段会一直往后判断,直到最后一步:i==n;}}return false;}//绘制棋盘,这时候已经得到了一个完整的queens信息;public void printQueens(){for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {if(queens[i]==j){System.out.print("Q  ");}else{System.out.print("*  ");}}System.out.println();}System.out.println();}
//    判断是否可以放,传进来的参数是 当前行 和 要放的列public boolean isValid(int i,int j) {
//      这时候我们要从第一行开始,到当前行结束,逐行判断是不是可以放在这一列for (int pointI = 0; pointI < i; pointI++) {//获得指针行的指针列int pointCol = queens[pointI];//判断当前位置是不是和指针行的皇后同列,左对角,或者右对角if (j == pointCol || j == pointCol - i + pointI || j == pointCol + i - pointI) {return false;}//如此继续经历拷打,当所有的指针行都不冲突,返回true}return true;}
//  用来测试:八皇后共有92种解法public static void main(String[] args) {EightQueens eightQueens = new EightQueens();eightQueens.solve(0);System.out.println(eightQueens.getCount());}
}

四、总结反思

在解决问题的时候,可以按照步骤来,简化返回值。
需要判断的地方,一般来说返回boolean就可以。
结果的存储或者可视化,放在终点去处理。

一开始想着返回一个结果来着,然后感觉思路就很不清晰,考虑的事情就太多了。
就是给一个下标的指针,和一个处理一半的queens。返回的是又处理了一部分的queens……写的超级混乱……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/878.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stable Diffusion 模型分享:ChilloutMix(真实、亚洲面孔)chilloutmix_NiPrunedFp32Fix

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八 下载地址 模型介绍 相信近来吸引大家想一试 Stable Diffusion 图像生…

嵌入式面试-回答I2C

说明&#xff1a; 此文章是在阅读了一些列面试相关资料之后对于一些常见问题的整理&#xff0c;主要针对的是嵌入式软件面试中涉及到的问答&#xff0c;努力精准的抓住重点进行描述。若有不足非常欢迎指出&#xff0c;感谢&#xff01;在总结过程中有些答案没标记参考来源&…

轻薄手机,没有一款新机能超越小米11青春版,小米和苹果也没有

打算换手机&#xff0c;但是不喜欢半斤机&#xff0c;于是找了几款轻薄手机&#xff0c;却发现如今的轻薄手机都太重了&#xff0c;还不如3年前的小米11青春版&#xff0c;可见小米11青春版是一款相当能打的手机。 小米11青春版搭载骁龙778芯片&#xff0c;重量只有159克&#…

傅里叶变换的本质。傅里叶案例。数字信号和模拟信号应用数字信号和模拟信号区别和优势。

目录 傅里叶案例 案例:音频降噪处理 案例:图像 积分和求和的关系

《游戏系统设计十二》灵活且简单的条件检查系统

目录 1、序言 2、需求 3、实现 3.1 思路 3.2 代码实现 4、总结 1、序言 每个游戏都有一些检查性的任务&#xff0c;在做一些判断的时候&#xff0c;判断等级是不是满足需求。 比如如下场景&#xff1a;在进入副本的时候需要检查玩家等级是否满足&#xff0c;满足之后才…

【npm淘宝源最新解决方案】 https://registry.npm.taobao.org此地址已失效

【npm淘宝源最新解决方案】 https://registry.npm.taobao.org此地址已失效 最新淘宝源&#xff1a; npm config set registry https://registry.npmmirror.com

YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 / RTDETR -gui界面-交互式图形化界面

往期热门博客项目回顾&#xff1a;点击前往 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上…

js-pytorch:开启前端+AI新世界

嗨&#xff0c; 大家好&#xff0c; 我是 徐小夕。最近在 github 上发现一款非常有意思的框架—— js-pytorch。它可以让前端轻松使用 javascript 来运行深度学习框架。作为一名资深前端技术玩家&#xff0c; 今天就和大家分享一下这款框架。 往期精彩 Nocode/Doc&#xff0c;可…

JWT和Redis比较选型

一、Session 二、JWT 三、比较 基于JWT&#xff08;JSON Web Token&#xff09;和Session身份验证之间的争论是现代 Web 开发中的一个要点。 JWT 身份验证&#xff1a;无状态。服务器生成一个令牌&#xff0c;客户端存储该令牌并随每个请求一起提供&#xff0c;服务端仅需按照…

LeetCode in Python 200. Number of islands (岛屿数量)

岛屿数量既可以用深度优先搜索也可以用广度优先搜索解决&#xff0c;本文给出两种方法的代码实现。 示例&#xff1a; 图1 岛屿数量输入输出示意图 方法一&#xff1a;广度优先搜索(bfs) 代码&#xff1a; class Solution:def numIslands(self, grid):if not grid:return 0…

IO综述·

阻塞模式 读写数据会发生阻塞现象。当用户线程发起IO请求之后&#xff0c;内核会查看数据检查就绪。如果没有就绪就会等待数据就绪。而用户线程会处于阻塞状态&#xff0c;用户线程交出CPU。当数据就绪之后&#xff0c;内核会将数据拷贝到用户线程&#xff0c;并返回结果给用户…

使用MyBatis插入数据并返回自动生成的ID

在使用MyBatis进行数据库操作时&#xff0c;经常会遇到需要插入数据并返回自动生成的主键ID的情况。为了解决这个问题&#xff0c;我们可以使用MyBatis提供的useGeneratedKeys和keyProperty属性。本文将介绍这两个属性的作用以及如何使用它们来实现插入数据并返回自动生成的ID。…

KMP算法(Python)

进阶的做法就是KMP算法&#xff0c;当然暴力也能ac。 KMP主要用一个nex列表&#xff0c;nex[i]存储&#xff08;模式串needle中&#xff09;从第0个到i个字符串s中的一个相等前后缀的最大长度。比如说对于aabaa来说&#xff0c;最大长度应该是&#xff08;前缀aa&#xff09;和…

Android12中JAVA项目中proto文件的编译方式

一. 起因 最近的工作有涉及到将原来Android9平台下的java工程防到Android12中编译&#xff0c;结果发现在Android9中可以编译的工程&#xff0c;没有修改Android.bp&#xff0c;在Android12中编译失败了&#xff0c;原因是java文件中以来项目中的proto文件生成的java类&#xf…

Linux下SPI设备驱动实验:验证读写SPI设备中数据的函数功能

一. 简介 前面文章实现了 SPI设备驱动框架&#xff0c;并在此基础上添加了字符设备驱动框架&#xff0c;实现了读 / 写SPI设备中数据的函数&#xff0c;文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;向SPI驱动框架中加入字符设备驱动框架代码-CSDN博客 Linux下…

算法打卡day51|单调栈篇02| Leetcode 503.下一个更大元素II、42. 接雨水

算法题 Leetcode 503.下一个更大元素II 题目链接:503.下一个更大元素II 大佬视频讲解&#xff1a;503.下一个更大元素II视频讲解 个人思路 这道题和之前496.下一个更大元素 I 差不多&#xff0c;只是这道题需要循环数组&#xff0c;那就在遍历的过程中模拟走两遍nums就行&a…

mac修改/etc/profile导致终端所有命令不可使用

原因&#xff1a;配置docker环境的时候修改了/etc/profile&#xff0c;没想到导致悲惨事情&#xff0c;输入什么命令都是 Command not found 可恶&#xff01;&#xff01;&#xff01;试了好久&#xff0c;最终这样搞定&#xff01; 1-终端输入命令 因为sudo命令也不能直接…

本地主机搭建服务器后如何让外网访问?快解析内网端口映射

本地主机搭建应用、部署服务器后&#xff0c;在局域网内是可以直接通过计算机内网IP网络地址进行连接访问的&#xff0c;但在外网电脑和设备如何访问呢&#xff1f;由于内网环境下&#xff0c;无法提供公网IP使用&#xff0c;外网访问内网就需要一个内外网转换的介质。这里介绍…

使用Python实现时间序列预测模型

时间序列预测是一种重要的数据分析技术&#xff0c;它可以帮助我们预测未来的趋势和模式。在本文中&#xff0c;我们将介绍时间序列预测的基本原理和常见的预测模型&#xff0c;并使用Python来实现这些模型。 什么是时间序列预测&#xff1f; 时间序列预测是根据过去的观测数…

在PostgreSQL中如何创建和使用自定义函数,包括内置语言(如PL/pgSQL)和外部语言(如Python、C等)?

文章目录 一、使用内置语言 PL/pgSQL 创建自定义函数示例代码使用方法 二、使用外部语言 Python 创建自定义函数安装 PL/Python 扩展示例代码使用方法 三、使用外部语言 C 创建自定义函数编写 C 代码编译为共享库在 PostgreSQL 中注册函数注意事项 总结 PostgreSQL 是一个强大的…