当前位置: 首页 > news >正文

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 数组中的位置,在棋盘上绘制皇后。
    • 绘制棋盘线,包括横线和竖线,以分隔棋盘格子。
  • 输出结果

 

  • 使用文件 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • centos7防火墙白名单总结
  • 在MySQL中,要查询所有用户及其权限,您可以使用以下命令:
  • springboot+redis+缓存
  • 59.【C语言】内存函数(memmove函数)
  • python爬虫初体验(二)
  • 611. 有效三角形的个数
  • pip install、yum install和conda install三者技术区分
  • Django一分钟:DRF快速实现JWT认证与RBAC权限校验
  • 《程序猿之设计模式实战 · 适配器模式》
  • Vue3中shallowRef和ref区别
  • MySQL篇(事务 - 基础)
  • STL队列
  • 部标(JT/T1078)流媒体对接说明
  • POI操作EXCEL插入图片
  • 两数之和、三数之和、四数之和
  • 【刷算法】求1+2+3+...+n
  • Brief introduction of how to 'Call, Apply and Bind'
  • Electron入门介绍
  • Java精华积累:初学者都应该搞懂的问题
  • Java面向对象及其三大特征
  • Mac转Windows的拯救指南
  • PHP的类修饰符与访问修饰符
  • React系列之 Redux 架构模式
  • Redis字符串类型内部编码剖析
  • SOFAMosn配置模型
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • SpriteKit 技巧之添加背景图片
  • use Google search engine
  • webpack项目中使用grunt监听文件变动自动打包编译
  • Yeoman_Bower_Grunt
  • 前端
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 入口文件开始,分析Vue源码实现
  • 实现菜单下拉伸展折叠效果demo
  • 微信小程序--------语音识别(前端自己也能玩)
  • 新版博客前端前瞻
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 数据可视化之下发图实践
  • ​MySQL主从复制一致性检测
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • #NOIP 2014# day.1 T2 联合权值
  • #stm32整理(一)flash读写
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (办公)springboot配置aop处理请求.
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十六)视图变换 正交投影 透视投影
  • (实战篇)如何缓存数据
  • (算法设计与分析)第一章算法概述-习题
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转载)Google Chrome调试JS
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)