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

华容道问题求解第一部分_思路即方案设计

一、前言

华容道是一种传统的益智游戏,通常由一个长方形木板和若干个方块组成。其中包括一个或多个不同颜色的方块(也称为车块)和其他大小相同的方块(也称为障碍块)。游戏的目标是将车块从木板的一个端点移动到另一个端点,通过调整其他方块的位置来清除道路并组成一个通路。华容道可以锻炼思考和推理能力,提高空间想象和逻辑能力。这个游戏在中国有着很长的历史,并在全世界广受欢迎。(以上内容来自INSCODE AI 创作助手)

而笔者接触这问题要追溯到敝人的小学时期了,依稀记得在上学的路上,有成人玩这个游戏,感到非常有趣。知道最少80多步可以将被困的曹操从华容道放走。在十几年前,笔者在某公司谋职时,曾经用C#写了一个简版的求解。该解法目的是在于锻炼笔者的思维,以及软件编程方面的技巧。当时的解法是1000多步,我知道这个肯定是软件有疏漏,没有找到最佳方法,或者是没有穷举到所有方法所致,因此想重写这个问题的求解。
在重写的过程中,主要解决以下两个问题:
第一:步数的确定
在上一个版本中,对步数的计算非常模糊,和人移动棋子的步骤的步数较大差异。例如,下图:
在这里插入图片描述
从A将小卒(方块)移到B处, 按照人的步骤应该是一步,但是软件中算成两步;

第二:没有穷举出所有方法
这个大约是源于算法中的疏漏,需要在重构具体解法。
第三:寻找最少步数
这个算法其实不难,就是限定步数,就是如果步数超过了限定值,就放弃,这样就可以找到最少步数。缺点就是在最坏的情况下可能要穷举所有步骤,可以采用经验值法,例如上限设为90步。这个涉嫌作弊了,也可以从 1 逐渐增大上限值,这样就会很慢。当然怎么找到一个快速的路径是一个问题,一个优化的问题。


二、功能描述

软件名称:华容道
功能:1:提供一个人机交互界面,可以通过鼠标进行游戏;
2:自动求解
自动求解并找出最优解,即公认的81步走法;
3:将提供两个版本,电脑版和手机版。其中电脑版指Windows版本,将使用C#;手机版使用Flutter或者Unity;
实现方法:
DFS
寻求到一个解后,再去寻找另一个解法。这就是DFS,深度优先算法。


三、概要设计

3.1 总体功能描述

基础功能分成两个方面进行,数据层和呈现层,还有两者的适配功能。

3.1.1数据层

1、静态数据1.1 棋盘布局1.2 棋子描述棋子的静态结构包含以下属性:name:名称size: 长宽,整数icon:图标position: 头部位置,定义为左上角位置。2、动态数据2.1 布局记录2.2 步骤记录
3、 逻辑和方法3.1 遍历移动采用两种方法移动:A 遍历移动, B 经验移动。首先采用遍历移动,这种方法将探索理论上所有的移动方法。为了描述清晰,进行一个简单的定义方向定义: 方向1:向上方向2:向右方向3:向下方向4:向左上下左右均指屏幕的上下左右步长定义:移动一个基本小方块为一个步长,根据题目限定,最多一次可以移动两个步长;步数:移动一次即为一步,注意一次可能移动一个步长,也可能移动两个步长。3.2 经验移动引入移动人工经验移动方法,这样可以快速移动,需要引入类似于公式或者围棋中定式的概念。这个方法需要单独研究。3.3 移动方法3.3.1 DFS 方法确定可以移动的方块,只有空白区域周边的方块才有可能移动;因此首先定位空白区域,然后查找周边方块,放入备选移动方块集合中;然后从该集合中按照一定顺序移动方块,移动方块后,空白区域发生变化,因此需要重复上面的步骤。如下图所示

在这里插入图片描述
3.3.1.1 棋子移动方法
变棋子的坐标即可。这样每个旗子的移动方法是统一的,
一次成功的改动,记作一步。
3.3.1.2 空余位置计算
两种方法:A) 根据棋子的坐标及其尺寸属性可以查找空余位置;
B) 每移动一个棋子,计算空余位置
3.3.1.3 可移动棋子查找
棋子移动之后,空余位置随即发生变化,为了进行下一步的移动,需要找到可移动的棋子。当然当期移动的棋子肯定是一个,但是不能进行反向移动,否则陷入死循环了。

3.1.2呈现层

呈现层就是将数据层的数据以合适的方式展现出来,给软件使用者一个展示,属于UI部分的设计。该部分将遵循一般的UI设计原则,同时将提供如下功能
1、布局设计
自动布局:提供游戏的经典布局样式
用户布局:用户自己可以定义布局
2、交互功能:提供一个可以使用键盘或者鼠标的游戏操作界面;
3、记录功能:记录用户操作过程并可以重现

3.1.3 适配器

适配器用于数据层和呈现层之间,负责将数据层中的位置关系等视觉信息提取出来提交给呈现层;也负责将呈现层的位置操作等指令转换成数据层的相应信息。下面的用词视角为界面视角即呈现层视角。
1、数据获取
应该是一组函数或者接口,从数据层获取呈现层需要的数据,这些数据应该是直接可用的数据;
2、发送数据
同样也是一组函数或者接口,将呈现层的操作转化为数据层可理解的数据,发送给数据层。


相关文章:

华容道问题求解第一部分_思路即方案设计

一、前言 华容道是一种传统的益智游戏,通常由一个长方形木板和若干个方块组成。其中包括一个或多个不同颜色的方块(也称为车块)和其他大小相同的方块(也称为障碍块)。游戏的目标是将车块从木板的一个端点移动到另一个…...

测试---UI自动化测试介绍

1、什么是自动化测试 概念:由程序代替人工进行系统校验的过程。--------计算机自己执行,好比手机上安装一个软件软件微信,抖音,微博之类的,在应用商城里面,下载对应app后,手机系统程序会自动安…...

DHCP Host Name

文章目录 前言DHCP OptionOption (12) Host Namednsmasq 前言 打开路由器页面,看到下面连接的设备,有的显示设备名称 Tmall-Genie、ESP-C37CE8,而有的直接显示 MAC 地址 D2:B0:XX:XX:XX:XX。 这个名称是哪里来的呢? 这就是我们今…...

uniapp到底用什么ui框架最合适-关于uni-app的ui库、ui框架、ui组件

文章目录 直接看答案关于uni-app的ui库、ui框架、ui组件组件的概念扩展组件的选择uni ui如何使用uni ui 综上,官方对组件的使用建议是:附录:其他全端兼容ui库参考文章: 直接看答案 如果想自己纯手写,直接用内置组件。…...

Flask 最佳实践(二)

Flask是一个轻量级而灵活的Web框架,提供了足够的自由度让开发者根据项目的需求进行定制。然而,为了在大型项目中保持代码的可维护性和可扩展性,建议采用以下一些建议的最佳实践。 在上一篇博客中,讲述了项目结构、蓝图相关的最佳实…...

【MATLAB源码-第93期】基于matlab的白鲸优化算法(BWO)和鲸鱼优化算法(WOA)机器人栅格路径规划对比。

操作环境: MATLAB 2022a 1、算法描述 白鲸优化算法(BWO) 白鲸优化算法是受到白鲸捕食和迁徙行为启发的一种算法。其主要特点和步骤包括: 1. 搜索食物(全局搜索):算法模仿白鲸寻找食物的行为。…...

nodejs微信小程序+python+PHP在线购票系统的设计与实现-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...

卷积神经网络训练情感分析

文章目录 1 CNN在自然语言的典型应用2 代码解释3 建议 1 CNN在自然语言的典型应用 卷积的作用在于利用文字的局部特征,一个词的前后几个词必然和这个词本身相关,这组成该词所代表的词群词群进而会对段落文字的意思进行影响,决定这个段落到底…...

github新建项目

参考链接:Github上建立新项目超详细方法过程 在这里新建一个repositories 接下来就选择相关的信息: 然后create a new就行了 接下来需要创建文件:(同时通过upload上传文件) 每次最多上传100个文件,然后保…...

CRC(循环冗余校验)直接计算和查表法

文章目录 CRC概述CRC名词解释宽度 (WIDTH)多项式 (POLY)初始值 (INIT)结果异或值 (XOROUT)输入数据反转(REFIN)输出数据反转(REFOUT) CRC手算过程模二加减&am…...

【算法思考记录】力扣2952. 需要添加的硬币的最小数量【C++,思路挖掘,贪心与证明】

原题链接 文章目录 需要添加的硬币的最小数量:贪心算法实现题目概述示例分析 关键思路分析贪心算法的优化选择证明案例推演与算法实现 C 实现结论 需要添加的硬币的最小数量:贪心算法实现 题目概述 在这个困难难度的算法题中,我们要解决的…...

用友NC JiuQiClientReqDispatch反序列化RCE漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC JiuQiClientReqDispatch 接口存在…...

Linux:docker镜像的创建(5)

1.基于已有镜像创建 步骤: 1.将原始镜像加入容器并运行 2.在原始镜像中部署各种服务 3.退出容器 4.使用下面命令将容器生成新的镜像 现在我们在这个容器里做了一些配置,我们要把他做成自己镜像 docker commit -m "centos7_123" -a "tarr…...

数据结构与算法-D2D3线性表之顺序表

线性表:包含若干数据元素的一个线性序列,特征如下: 1)对非空表,a0是表头,无前驱; 2)an-1是表尾,无后继; 3)其他元素仅且仅有一个前驱,…...

01_W5500简介

目录 W5500简介: 芯片特点: 全硬件TCPIP协议栈: 引脚分布: W5500简介: W5500是一款高性价比的以太网芯片,其全球独一无二的全硬件TCPIP协议栈专利技术,解决了嵌入式以太网的接入问题,简单易用&#xff…...

异常 Exception 练习题 (未完成)

异常 Exception 练习题 try-catch异常处理1234 异常1(没有自己写)234 try-catch异常处理 1 class Exception01 {public static int method() {try {String[] names new String[3];//String[]数组if (names[1].equals("tom")) {//NullPointe…...

Linux系统编程:并发与信号总结

并发 并发是指两个或多个同时独立进行的活动。在计算机系统中,并发指的是同一个系统中多个独立活动同时进行,而非依次进行。 并发在计算机系统中的表现: 一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是…...

Jmeter 接口-加密信息发送(一百九十九)

方式1:使用函数助手 比如MD5加密方式: 如图,需要对${user}进行MD5加密 1、打开函数助手,找到MD5,输入需要加密的值 2、将${__MD5(${user},)}放到请求中 3、查看请求,请求成功 方式2:导入jar包…...

微信小程序nodejs+vue+uniapp视力保养眼镜店连锁预约系统

作为一个视力保养连锁预约的网络系统,数据流量是非常大的,所以系统的设计必须满足使用方便,操作灵活的要求。所以在设计视力保养连锁预约系统应达到以下目标: (1)界面要美观友好,检索要快捷简易…...

掌握Vue侦听器(watch)的应用

文章目录 🍁watch 的优缺点🍂Watch 优点🍂Watch 缺点 🍁watch 的用法🍂对象式 watch🍂函数式 watch 🍁代码示例🍂监听基本数据类型🍂监听复杂数据类型(Object…...

SAP-PP:PP顾问管理系统的相关建议

本博客将探讨生产计划领域的控制要点。这将有助于减少仓库库存不准确情况,因为库存不准确会导致实物库存、发货、成本核算和计划方面出现许多效率低下的问题。 在物料主数据关键字段中,必须配置计划交货时间、GR处理时间、内部生产时间、计划交货时间&a…...

Unity资源路径与读取

Unity资源路径有: 1、StreamingAssets:只读,一般用于存放应用程序运行时需要加载的资源文件,可以通过Application.streamingAssetsPath来获取。 2、PersistentDataPath:可读写,一般用于存放应用程序运行时…...

“大+小模型”赋能油气行业高质量发展

近日,中国石油石化科技创新大会暨新技术成果展在北京盛大举行,九章云极DataCanvas公司携油气行业一站式AI综合解决方案重磅亮相,充分展示了公司助推油气行业实现AI规模化应用深厚的AI技术实力和领先的AI应用水准,赢得了行业专家和…...

【win32_004】字符串处理函数

StringCbPrintf 函数 (strsafe.h):格式化字符串 STRSAFEAPI StringCbPrintf([out] STRSAFE_LPSTR pszDest,//目的缓冲区 LPSTR指针或者数组[in] size_t cbDest,//目的缓冲区大小[in] STRSAFE_LPCSTR pszFormat,//格式 例如: TEXT("%d&…...

如果不小心修改了按钮的名字并且忘记了原名字

出现上述情况,可以右边点击转到代码,注释掉问题行,此页的设计界面就恢复了。...

opencv阈值处理

阈值处理 二值化 自适应阈值 OTSU二值化...

html之JS

1、JS的引入 <!-- 内嵌 --><!-- <script>alert(4)</script> --><!-- 外引 --><!-- 内嵌和外引同时有的时候&#xff0c;内嵌被覆盖 --><script src"js/index.js" defer></script>//defer 延迟执行 2、js的变量使用…...

SQL Server的安装和首个库的创建

一、熟悉SQL Server的安装环境&#xff1b; 1.安装Microsoft的数据库管理系统SQL Server 2022 先把SQL Server 2022下载好后进行解压后出现以下界面然后点击基本进行安装 然后会出现以下界面&#xff1a; 一步步按照提示往下走即可&#xff0c;把SQL Server 2022安装完成后再…...

STM32下载程序的五种方法

刚开始学习 STM32 的时候&#xff0c;很多小伙伴满怀热情买好了各种设备&#xff0c;但很快就遇到了第一个拦路虎——如何将写好的代码烧进去这个黑乎乎的芯片&#xff5e; STM32 的烧录方式多样且灵活&#xff0c;可以根据实际需求选择适合的方式来将程序烧录到芯片中。本文将…...

基于springboot + vue大学生竞赛管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…...

做传媒网站公司名称/seo站长工具是什么

要让用户控件的子控件具有外部访问权限可以修改子控件的Modifiers属性为public...

企业网站建设免费/山东百度推广

js web开发截至2012年8月的一个非常有趣JavaScript Web开发列表。 您可以在此集合中找到一些以前从未使用过的最酷JavaScript创建方法。 玩得开心&#xff01; 相关文章&#xff1a; 2012年7月版 2012年6月版 2012年5月版 Blogger多图库显示引擎 这是一个很棒的多画廊显示…...

电子政务建设与政府网站建设/百度seo推广怎么做

static与非static成员&#xff08;函数&#xff09; 《C Primer》第4版399页&#xff1a;对于特定类类型的全体对象而言&#xff0c;访问一个全局变量有时是必要的。然而&#xff0c;全局变量会破坏封装&#xff1a;对象需要支持特定类抽象的实现。如果对象是全局的&#xff0c…...

建设网站报告书/免费推广引流平台

我有些尴尬地拿着水杯&#xff0c;正对面坐着来访的王总&#xff0c;他是在别处打拼的人&#xff0c;这几年据说收获颇丰&#xff0c;见移动互联网如火如荼&#xff0c;自然也想着要进来干一场&#xff0c;尽管王总从事的行当也算跟IT沾边&#xff0c;但毕竟太长时间不接触技术…...

优速网站建设工作室/短网址在线生成

在上集中&#xff0c;我们已经构建了一个简单的待办列表应用&#xff08;to-do list app&#xff09;&#xff0c;这个应用可以在待办项过期时通过本地通知提醒用户。现在&#xff0c;我们要在之前的基础上添加以下功能&#xff1a;应用图标角标上显示过期待办项的数量、通知动…...

网站建设的合同书/网络营销策略制定

一、前言为了方便小公司没有运维开发人员&#xff0c;利用Jenkin解决了繁琐的打包部署问题。这次我就写了一个Gogs的集成教程&#xff0c;我觉的Gogs私服比较简单&#xff0c;其他的GitLab、svn、GitHub基本上也是一样的&#xff0c;搭建好了&#xff0c;开发人员只需要提交到版…...