Java语言程序设计基础篇_编程练习题**18.26 (创建一个迷宫)

news2024/9/28 0:24:49

目录

题目:**18.26 (创建一个迷宫)

习题思路

代码示例 

输出结果


题目:**18.26 (创建一个迷宫)

  编写一个程序,在迷宫中寻找一条路径,如图18-13a所示。该迷宫由一个8 x 8 的棋盘表示。路径必须满足下列条件:

  1. 路径在迷宫的左上角单元和右下角单元之间。
  2. 程序允许用户在一个单元格中放入或移走一个标志。路径由相邻的未放标志的单元格组成。如果两个单元格在水平方向或垂直方向相邻,但在对角线方向上不相邻,那么就称它们是相邻的。
  3. 路径不包含能形成一个正方形的单元格。例如,在图18-13b中的路径就不满足这个条件。( 这个条件使得面板上的路径很容易识别。)
  • 习题思路
  1. 创建一个单元格类(cell),继承自StackPane类。
    1. 创建几个私有变量,分别表示是否被访问,是否被标记,是否被阻塞,并创建相应的方法。
    2. 创建一个Rectangle,在构造方法被调用时添加到面板中。
    3. 创建两条直线,在单元格上组成一个叉号,但暂时不放置在面板上。
    4. 当单元格被点击时,如果单元格未被标记,那么将单元格设置为已标记(调用方法将两条直线放置在面板上,标记变量设置为true)。已被标记则设置为不标记(调用方法从面板上删除直线标记变量设置为false)。
  2. (start方法内部)
    1. 创建私有变量单元格列表( cells[8][8]),创建私有变量Label
      1. 在start方法中定义一个GridPane,使用循环示例化cells并添加到面板中
      2. 创建两个HBox,分别放置一个Label和两个按钮
      3. 创建一个BorderPane,将GridPane放置在中心,两个HBox分别放置在顶部和底部。
      4. 为两个按钮注册事件,find按钮对应③的findPath方法;clear按钮对应④的clear方法。
  3. (findPath)方法,传入坐标参数,返回值boolean
    1. 如果传入的坐标是7*7,即终点坐标,则返回true。
    2. 如果上方单元格(row-1, col)是可访问的(即未标记、未阻塞且未访问过),则尝试从那里继续搜索,在递归调用findPath之前,调用block(row, col)。
    3. 尝试向下、向左、向右移动,与向上移动的逻辑类似,但分别针对下方、左方和右方单元格进行尝试。
  4. (clear)方法
    1. 使用循环为cells中的元素逐个调用unSelect方法()。
  5. 其他自行查看代码 

  • 代码示例 

编程练习题18_26labyrinth.java

package chapter_18;

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class 编程练习题18_26labyrinth extends Application{
	private cell[][] cells = new cell[8][8];
	private double WIDTH = 400;
	private double HEIGHT = 400;
	private Label lbPathInfo;
	@Override
	public void start(Stage primaryStage) throws Exception {
		// TODO Auto-generated method stub
		GridPane gridPane = new GridPane();
		gridPane.setStyle("-fx-background-color: gray");
		gridPane.setHgap(2);
		gridPane.setVgap(2);
		
		for(int i = 0;i < 8;i++) {
			for(int j = 0;j < 8;j++) {
				gridPane.add(cells[i][j] = new cell(), i, j);
			}
		}
		lbPathInfo = new Label("INFO");
		HBox hBox = new HBox(lbPathInfo);
		hBox.setAlignment(Pos.CENTER);
		
		Button btFind = new Button("Find Path");
		Button btClear = new Button("Clear Path");
		btClear.setOnAction(e -> clear());
		btFind.setOnAction(e -> findPath());
		HBox hBox2 = new HBox(btFind,btClear);
		hBox2.setAlignment(Pos.CENTER);
		
		
		BorderPane borderPane = new BorderPane();
		borderPane.setCenter(gridPane);
		borderPane.setTop(hBox);
		borderPane.setBottom(hBox2);
		
		Scene scene = new Scene(borderPane);
		primaryStage.setTitle("编程练习题18_26labyrinth");
		primaryStage.setScene(scene);
		primaryStage.show();
		
	}
	public void clear() {
		for(cell[] c:cells) {
			for(cell cel:c) {
				cel.unSelect();
			}
		}
	}
	public void findPath() {
		if(findPath(0,0)) {
			lbPathInfo.setText("Path found");
		}else {
			lbPathInfo.setText("No legal path exists");
		}
	}
	public boolean findPath(int row,int col) {
		cells[row][col].visit();
		
		if((row==7)&&(col==7)) {
			cells[row][col].select();
			return true;
		}
		if((row>0)&&!cells[row-1][col].isMark()&&
				!cells[row-1][col].blocked()&&!cells[row-1][col].visited) {
			block(row, col);
			
			if(findPath(row-1, col)) {
				cells[row][col].select();
				return true;
			}
			unblock(row, col);
		}
		
		if((row < 7)&&!cells[row+1][col].isMark()&&
				!cells[row+1][col].blocked()&&!cells[row+1][col].visited()) {
			block(row, col);
			if(findPath(row + 1,col)) {
				cells[row][col].select();
				return true;
			}
			unblock(row, col);
		}
		if((col > 0)&&!cells[row][col-1].isMark()&&
				!cells[row][col-1].blocked()&&!cells[row][col-1].visited()) {
			block(row, col);
			if(findPath(row, col - 1)) {
				cells[row][col].select();
				return true;
			}
			unblock(row, col);
		}
		if((col < 7)&&!cells[row][col+1].isMark()&&
				!cells[row][col+1].blocked()&&!cells[row][col+1].visited()) {
			block(row, col);
			if(findPath(row,col+1)) {
				cells[row][col].select();
				return true;
			}
			unblock(row, col);
		}
		return false;
	}
	public void block(int row,int col) {
		if(row > 0) 
			cells[row - 1][col].block();
		if(row < 7) 
			cells[row+1][col].block();
		if(col > 0)
			cells[row][col-1].block();
		if(col < 7)
			cells[row][col+1].block();
	}
	public void unblock(int row,int col) {
		if(row > 0)
			cells[row-1][col].unblock();
		if(row < 7)
			cells[row+1][col].unblock();
		if(col > 0)
			cells[row][col-1].unblock();
		if(col < 7)
			cells[row][col+1].unblock();
	}
	public static void main(String[] args) {
		Application.launch(args);
	}
	class cell extends StackPane{
		private boolean selected = false;
		private boolean visited = false;
		private boolean blocked = false;
		private Rectangle r = new Rectangle(WIDTH/8,HEIGHT/8);
		Line l1 = new Line(0, 0, WIDTH/8, HEIGHT/8);
		Line l2 = new Line(WIDTH/8, 0, 0, HEIGHT/8);
		public cell() {
			getChildren().add(r);
			r.setFill(Color.WHITE);
			r.setStroke(Color.BLACK);
			this.setOnMouseClicked(e ->{
				if(selected) {
					unMark();
				}else {
					mark();
				}
			});
		}
		public boolean blocked() {
			return blocked;
		}
		public void block() {
			blocked = true;
		}
		public void unblock() {
			blocked = false;
		}
		public void visit() {
			visited = true;
		}
		public boolean visited() {
			return visited;
		}
		public boolean isMark() {
			return selected;
		}
		public void mark() {
			selected = true;
			this.getChildren().addAll(l1,l2);
		}
		public void unMark() {
			selected = false;
			this.getChildren().remove(l1);
            this.getChildren().remove(l2);
		}
		public void select() {
			r.setFill(Color.RED);
		}
		public void unSelect() {
			unblock();
			r.setFill(Color.WHITE);
			visited = false;
		}
	}
}
输出结果

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

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

相关文章

日志收集工具 Fluentd vs Fluent Bit 的区别

参考链接&#xff1a; FluentdFluentd BitFluentd & Fluent Bit | Fluent Bit: Official Manual Fluentd 与 Fluent Bit 两者都是生产级遥测生态系统&#xff01; 遥测数据处理可能很复杂&#xff0c;尤其是在大规模处理时。这就是创建 Fluentd 的原因。 Fluentd 不仅仅是…

国产化中间件正在侵蚀开源中间件

开源中间件的发展趋势表明&#xff0c;它们将继续在技术创新和生态建设中发挥重要作用&#xff0c;尤其是在云计算、大数据等新兴技术领域。开源中间件如Apache Kafka、RabbitMQ、ActiveMQ和RocketMQ等在市场上有着广泛的应用。它们在技术社区中得到了良好的支持&#xff0c;并…

k8s中控制器的使用

目录 一、什么是控制器 二、控制器常用类型 三、replicaset控制器 1、replicaset功能 2、replicaset参数说明 3、replicaset示例 四、deployment控制器 1、deployment控制器的功能 2、deployment控制器示例 &#xff08;1&#xff09;版本迭代 &#xff08;2&#x…

MySql的基础讲解

一、初识MySql 数据库&#xff1a;按照数据结构来组织、存储和管理数据的仓库&#xff1b;是一个长期存储在计算机内的、有组织的、可共享 的、统一管理的大量数据的集合&#xff1b; OLTP&#xff1a;联机事务处理&#xff0c;主要是对数据库的增删改查。 OLTP 主要用来记录…

【研赛论文】数学建模2024华为杯论文word/latex模板

国赛结束&#xff0c;研究生瞩目的研赛马上就要来了&#xff0c;相信研究生同学也是在努力的准备当中&#xff0c;在这里祝愿大家能够获得一个好的名次。一举冲出重围&#xff0c;拿下国奖。在数模比赛当中&#xff0c;论文是参赛者唯一能够与评阅老师进行沟通的方式&#xff0…

【Python爬虫系列】_021.异步请求aiohttp

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈

本地部署大模型并使用知识库Windows下Ollama+Docker+MaxKB安装的记录

概要 本文介绍本地部署大模型和知识库的小白方法&#xff0c;可以运行较多种类的大模型&#xff0c;使用的软件为docker和ollama以及MaxKb作为知识库前端。 下载 各安装包可以百度去官网或者github下载或使用&#xff0c;也可以点击下面的的链接和我下载相同的版本。 ollama…

uniapp child.onFieldChange is not a function

uni-forms // 所有子组件参与校验,使用 for 可以使用 awiatfor (let i in childrens) {const child childrens[i];let name realName(child.name);if (typeof child.onFieldChange function) {const result await child.onFieldChange(tempFormData[name]);if (result) {…

如何准备教师资格证科目三“学科知识与教学能力”的考试与面试?(理科导向:数学/物理)

如何准备教师资格证科目三“学科知识与教学能力”的考试与面试&#xff1f;&#xff08;理科导向&#xff1a;数学/物理&#xff09; ​ 目录 收起 1 前言 1.1 自身经历 1.2 教师资格证的作用 2 知识点题型分数的分布与学习建议 2.1 科目三的知识点分数分布&#xff1a; …

Python 全栈系列271 微服务踩坑记

说明 这个坑花了10个小时才爬出来 碰到一个现象&#xff1a;将微服务改造为并发后&#xff0c;请求最初很快&#xff0c;然后就出现大量的失败&#xff0c;然后过一会又能用。 过去从来没有碰到这个问题&#xff0c;要么是一些比较明显的资源&#xff0c;或者逻辑bug&#xff0…

Matlab simulink建模与仿真 第十三章(信号通路库)

参考视频&#xff1a;simulink1.1simulink简介_哔哩哔哩_bilibili 一、信号通路库中的模块概览 1、信号通路组 注&#xff1a;部分模块在第二章中有介绍&#xff0c;本章不再赘述。 2、信号存储和访问组 二、总线分配模块 Bus Assignment模块接受总线作为输入&#xff0c;并…

Python之NumPy超详细学习指南:从入门到精通(上篇)

文章目录 Python NumPy学习指南&#xff1a;从入门到精通第一部分&#xff1a;NumPy简介与安装1. 什么是NumPy&#xff1f;2. 安装NumPy使用pip安装&#xff1a;使用Anaconda安装&#xff1a; 第二部分&#xff1a;NumPy数组基础1. NumPy数组的创建从列表创建一维数组&#xff…

Proxyless Service Mesh:下一代微服务架构体系

一、项目背景及意义 在当今的微服务架构中&#xff0c;应用程序通常被拆分成多个独立的服务&#xff0c;这些服务通过网络进行通信。这种架构的优势在于可以提高系统的可扩展性和灵活性&#xff0c;但也带来了新的挑战&#xff0c;比如&#xff1a; 服务间通信的复杂性&#…

Cisco Modeling Labs (CML) 2.7.2 发布下载,新增功能概览

Cisco Modeling Labs (CML) 2.7.2 - 网络仿真工具 思科建模实验室 (CML) 请访问原文链接&#xff1a;https://sysin.org/blog/cisco-modeling-labs-2/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Cisco Modeling Labs 是我…

Geneformer中文教程(2).huggingface transformers

Geneformer基于hugging face的transformers实现&#xff0c;具体模型是BertForSequenceClassification&#xff0c;本篇先熟悉该模型。 首先直观看Geneformer的模型架构&#xff0c;基于BERT构建一个文本分类模型&#xff0c;我们直接从预训练的Geneformer加载BERT&#xff0c…

Linux相关:在阿里云下载centos系统镜像

文章目录 1、镜像站2、下载方式一2.1、第一步打开镜像站地址2.2 下载地址: https://mirrors.aliyun.com/centos/2.3、选择7版本2.4、镜像文件在isos文件夹中2.5、选择合适的版本 3、下载镜像快捷方式 1、镜像站 阿里云镜像站地址 2、下载方式一 2.1、第一步打开镜像站地址 2…

第二十五章 添加数字签名

文章目录 第二十五章 添加数字签名数字签名概述添加数字签名 第二十五章 添加数字签名 本主题介绍如何向 IRIS Web 服务和 Web 客户端发送的 SOAP 消息添加数字签名。 通常&#xff0c;会同时执行加密和签名。为简单起见&#xff0c;本主题仅介绍签名。有关结合加密和签名的信…

4K投影仪选购全攻略:全玻璃镜头的当贝F6,画面细节纤毫毕现

在当今的投影市场上&#xff0c;4K投影仪已经成了主流产品&#xff0c;越来越多家庭开始关注如何选择一款性价比高、口碑好的4K投影仪。4K投影仪其实指的是具备3840*2160像素分辨率投影仪&#xff0c;它能够提供更清晰、更细腻、更真实的画面效果。 那么4K投影仪该怎么选&…

【Qt界面优化】—— QSS 的介绍

目录 &#xff08;一&#xff09;背景介绍 &#xff08;二&#xff09;基本语法 &#xff08;三&#xff09;QSS设置方式 3.1 指定控件样式设置 3.2 全局样式设置 3.3 使用Qt Designer编辑样式 &#xff08;四&#xff09;选择器 4.1 选择器概况 4.2 子控件选择器(…

石英砂酸洗废酸处理

石英砂酸洗废酸处理是一个复杂而精细的过程&#xff0c;旨在将酸洗过程中产生的废酸中的有害物质去除&#xff0c;使其达到环保排放标准或实现资源化利用。以下是对该处理工艺方法的详细阐述&#xff1a; 一、废酸收集与调节 废酸收集&#xff1a;首先&#xff0c;将酸洗石英砂…