Java语言程序设计基础篇_编程练习题**18.34 (游戏:八皇后问题)

目录

题目:**18.34 (游戏:八皇后问题)

代码示例

 代码解析

输出结果

使用文件 


题目:**18.34 (游戏:八皇后问题)

  八皇后问题是要找到一个解决方案,将一个皇后棋子放到棋盘上的每行中,并且两个皇后棋子之间不能相互攻击。编写个程序,使用递归来解决八皇后问题,并如图18-17显示结果

  • 代码示例

编程练习题18_34EightQueens.java

package chapter_18;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Line;
import javafx.stage.Stage;public class 编程练习题18_34EightQueens extends Application{private static final int SIZE = 8;private int[] queens = new int[SIZE];public static void main(String[] args) {Application.launch(args);}@Overridepublic void start(Stage primaryStage) throws Exception {search(0);ChessBoard board = new ChessBoard();Scene scene = new Scene(board,250,250);primaryStage.setTitle("编程练习题18_34EightQueens");primaryStage.setScene(scene);primaryStage.show();board.paint();}private boolean isValid(int row,int col){for(int i = 1;i <= row;i++) {if(queens[row-i] == col||queens[row-i] == col-i||queens[row-i] == col+i)return false;}return true;}private boolean search(int row) {if(row == SIZE)return true;for(int col = 0;col < SIZE;col++) {queens[row] = col;if(isValid(row, col)&&search(row+1))return true;}return false;}private class ChessBoard extends Pane{Image queenImage = new Image("src/Image/queen03.png");public void paint() {this.getChildren().clear();for(int i = 0;i < SIZE ;i++) {ImageView imageView = new ImageView(queenImage);this.getChildren() .add(imageView);int j = queens[i];imageView.setX(j*getWidth()/SIZE);imageView.setY(i*getHeight()/SIZE);imageView.setFitWidth(getWidth()/SIZE);imageView.setFitHeight(getHeight()/SIZE);}for(int i =1;i <= SIZE;i++) {this.getChildren().add(new Line(0,i*getHeight()/SIZE,getWidth(),i*getHeight()/SIZE));this.getChildren().add(new Line(i*getWidth()/SIZE,0,i*getWidth()/SIZE,getHeight()));}}}
}
  •  代码解析

  1. 类定义与初始化
    • 编程练习题18_34EightQueens 类继承自 Application,是JavaFX应用程序的入口。
    • 定义了一个静态常量 SIZE 表示棋盘大小(8x8)。
    • 定义了一个整型数组 queens 用于存储每一行皇后的列位置。
  2. main 方法
    • 调用 Application.launch(args); 启动JavaFX应用程序。
  3. start 方法
    • 首先调用 search(0); 方法尝试找到一个解决方案(但不直接处理结果,因为此调用只是为了触发搜索)。
    • 创建 ChessBoard 类的实例,该实例将用于绘制棋盘和皇后。
    • 设置JavaFX场景并展示舞台。
    • 调用 board.paint(); 方法绘制棋盘和皇后。
  4. search 方法
    • 使用回溯算法尝试在每一行放置一个皇后,直到所有行都被填满或无法继续放置。
    • 通过 isValid 方法检查放置皇后的位置是否合法。
    • 如果成功找到解决方案(即所有行都被填满),则返回 true
  5. isValid 方法
    • 检查当前位置 (row, col) 是否与之前的任何皇后冲突。
    • 冲突条件包括:同一列、主对角线和副对角线。
  6. ChessBoard 类
    • 继承自 Pane,用于绘制棋盘和皇后。
    • 在 paint 方法中,首先清除之前的子节点(如果有的话)。
    • 然后,根据 queens 数组中的位置,在棋盘上绘制皇后。
    • 绘制棋盘线,包括横线和竖线,以分隔棋盘格子。
  • 输出结果

 

  • 使用文件 

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

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

相关文章

Oracle Truncate和delete的区别

DropTruncatedelete语句类型 DDl &#xff08;数据定义语言 Data Definition Language DDl &#xff08;数据定义语言 Data Definition Language DML&#xff08;数据操作语言 Data Manipulation Language 速度 快 删除整个表 快 一次性删除 慢 逐行删除 回滚不可不可可del…

基于C#+SQL Server2005(WinForm)图书管理系统

图书管理系统 一、 首先把数据库脚本贴出来(数据库名为library) USE [library] GO /****** Object: Table [dbo].[books] Script Date: 06/12/2016 11:27:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[books]([bNum] [nvarchar](10…

【python】利用python处理数据(stata等价命令)

1.一般运算 加法 # gen x y z df[x] df[y] df[z]减法 # gen x y - 1 df[x] df[y] - 1乘法 # gen var x * y df[var] df[x] * df[y]除法 # gen x z / y df[x] df[z] / df[y]取对数 # gen logx log(x) df[logx] np.log(df[x])开根号 # gen z sqrt(y) df[z] …

宝塔部署vue项目出现的各种问题

使用宝塔面板&#xff0c;网站页面&#xff0c;构建php静态网页 问题一&#xff1a;图片等静态资源无法加载 找到真正请求的url&#xff0c; 然后在项目目录下面创建对应的目录&#xff0c;将资源放入 问题二&#xff1a;刷新出现404 在这里任意位置添加 ## 添加上这个配…

socket.io-client实现实前后端时通信功能

这里我使用的后端 基于node.js的koa框架 前端使用的是vite {"name": "hou","version": "1.0.0","description": "","main": "app.js","scripts": {"test": "echo …

MongoDB-aggregate流式计算:去重操作

场景一&#xff1a;去重查询 在MongoDB的find查询里&#xff0c;可以直接使用distinct方法&#xff0c;但也有不少限制 在aggregate流式计算中&#xff0c;没有办法直接使用distinct方法&#xff0c;需要使用其他方法实现&#xff1a; 1、使用$group管道操作符&#xff0c;将需…

C语言中的typedef简介

type简介 在C语言中&#xff0c;typedef 是用于为现有的数据类型定义一个新的类型名称的关键字。它的作用是为类型取一个别名&#xff0c;使代码更简洁、更易于理解。 基本语法 typedef 原始类型 新类型名; 示例 为 int 类型定义一个别名&#xff1a; typedef int INTEGER…

网络安全:构建数字世界的坚固防线

网络安全&#xff1a;构建数字世界的坚固防线 在21世纪的今天&#xff0c;随着信息技术的飞速发展&#xff0c;互联网已经渗透到我们生活的方方面面&#xff0c;成为现代社会不可或缺的基础设施。从个人日常交流、在线购物、金融服务&#xff0c;到企业的运营管理、数据存储与…

浅谈虚拟内存(操作系统、Redis)

浅谈虚拟内存&#xff08;操作系统、Redis&#xff09; 参考&鸣谢 4.1 为什么要有虚拟内存&#xff1f; xiaolincoding 【简单说下】REDIS的虚拟内存机制,会吗?别翻书 aristo_boyunv Redis 虚拟内存 Java杨永杰 浅谈虚拟内存&#xff1a;操作系统与 Redis 在计算机系统中…

Vue3——Vite篇

Vite是一款由Vue.js的作者尤雨溪开发的前端构建工具&#xff0c;专为现代前端项目而设计。它以其快速的冷启动、按需编译和热更新能力而受到广泛关注。以下是对Vite的详细解析&#xff1a; 一、核心特性 快速启动&#xff1a; Vite利用浏览器原生支持的ES模块&#xff08;ESM…

ARM单片机的内存分布(重要)

ARM单片机的内存分布&#xff08;重要&#xff09; 一、S32K344的内存布局 MEMORY {int_pflash : ORIGIN 0x00400000, LENGTH 0x003D4000 /* 4096KB - 176KB (sBAF HSE)*/int_dflash : ORIGIN 0x10000000, LENGTH 0x00020000 /* 128KB …

BUUCTF [SCTF2019]电单车详解两种方法(python实现绝对原创)

使用audacity打开&#xff0c;发现是一段PT2242 信号 PT2242信号 有长有短&#xff0c;短的为0&#xff0c;长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》&#xff0c;2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W&#xff0c;而私营单位就业人员平均月薪只有5.7K左右。 图源&#xff1a;…

两数之和、三数之和、四数之和

目录 两数之和 题目链接 题目描述 思路分析 代码实现 三数之和 题目链接 题目描述 思路分析 代码实现 四数之和 题目链接 题目描述 思路分析 代码实现 两数之和 题目链接 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 题目…

在Java中如何利用ClassLoader动态加密、解密Class文件

文章目录 一、准备示例代码二、加密Class文件三、自定义ClassLoader四、使用自定义ClassLoader加载类五、进阶&#xff1a;使用更高安全性的AES加密算法六、注意事项 在Java开发中&#xff0c;保护代码的安全性是一个重要的课题。为了防止代码被轻易反编译&#xff0c;我们可以…

EfficientFormer实战:使用EfficientFormerV2实现图像分类任务(一)

摘要 EfficientFormerV2是一种通过重新思考ViT设计选择和引入细粒度联合搜索策略而开发出的新型移动视觉骨干网络。它结合了卷积和变换器的优势&#xff0c;通过一系列高效的设计改进和搜索方法&#xff0c;实现了在移动设备上既轻又快且保持高性能的目标。这一成果为在资源受…

signalR和WebSocket的区别是什么

SignalR和WebSocket都是用于实现实时双向通信的技术&#xff0c;但它们在多个方面存在区别。以下是它们之间的主要区别&#xff1a; 1. 技术层次与协议支持 WebSocket&#xff1a; 是一种在单个TCP连接上进行全双工通信的协议。它是HTML5规范的一部分&#xff0c;提供了浏览器…

Redis-01 入门和十大数据类型

Redis支持两种持久化方式&#xff1a;RDB持久化和AOF持久化。 1.RDB持久化是将Redis的数据以快照的形式保存在磁盘上&#xff0c;可以手动触发或通过配置文件设置定时触发。RDB保存的是Redis在某个时间点上的数据快照&#xff0c;可以通过恢复RDB文件来恢复数据。 2.AOF持久化…

python3 -m ensurepip来安装pip@Ubuntu Jammy

pip 是 Python 的包安装程序&#xff0c;它帮助我们安装和管理 Python 包。这些包可以是我们在 Python 项目中需要的库、框架、模块或应用程序。pip 使得安装、更新、卸载和列出已安装的包变得简单快捷。换句话说&#xff0c;如果没有pip&#xff0c;我们就没法安装和管理pytho…

封装 WBXpopup 组件

这是Popup组件基于微博小程序&#xff0c;需要改变标签&#xff0c;以及一写方法 支持四个方向抽屉&#xff0c;以及中间弹出功能 // 用法 <template><wbx-view style"height: 100vh;"><!-- 对话框组件 --><wbx-view><wbx-text click&quo…