基于C语言设计火柴棍移动
任务描述使用火柴棍可以搭出如下图所示的等式,编写搜索算法程序,移动一根火柴使等式成立。
主要任务如下:
允许在一个固定的等式库(两位数以内的加减乘法)中选择,从而给出答案;
允许使用者自己定义,或者输入一个可以求解的等式。如果无解,回答无解;
给出更多的题目和答案;
(选)允许移动 2 根火柴棍;
(选)给出从等式变为新的等式的题目和难度。
一、问题建模
1.1 状态空间
对于本次火柴棍移动问题(必做),参照状态空间表示法给出以下定义:
○1 状态:等式 x 中每个字符移动一根火柴(加、减、自身移位)可能变成的所有等式
○2 初始状态:原始等式 x
○3 目标状态:由原等式 x 移动一根且成立的等式
○4 转换操作:按照移动一根的规则更换等式中某个字符,获得新的等式
○5 代价函数:生成一个新等式移动的火柴根数(或移动操作总权值)选做中移动两根与上述类似;
考虑一个等式 x,假设 x 由五个字符组成(如 6+4=4),将每个字符看作一个格点,格点之间有路径相连,每条路径包含上一格点字符可能变成的新字符,如下图所示,搜索时遍历从起始字符到末位字符的所有路径,找出使等式成立且仅移动了一根火柴的全部路径。
二、算法设计和实现
2.1 数据组织结构
算法的实现依托于数据结构的组织,首先介绍本程序中的数据组织。为了提升搜索效率,程序开始时,调用函数 _(),将等式中可能出现的所有字符(’0-9’ ‘+’ ‘-‘ ‘*’ ‘=’)移动一根火柴棍能变成的新字符存入一张表中,后续搜索只需要直接从表中查找即可。
整张表为结构体类型的二维数组,定义结构体_,包含移动权值 flag 和变成的字符 data,移动权值的复制规则见表 1. 则二维数组[][]中每一个元素都具有一个 flag 值和一个 data 字符,m 对应原始字符,n 对应原始字符变成的新字符序号,便于搜索算法的实现。
2.1.1 表 1 移动权值赋值规则
移动操作
不变
自身移动一根
加一根
减一根
Flag 值
0
1000
10
100
2.2 搜索算法
搜索算法是这次编程作业的核心部分,整体搜索流程如图 1 所示。本项目中笔者共设计和实现了两种搜索算法——暴力搜索(for 循环)和深度优先搜索(递归),两种算法本质上相似,但在表示和具体实现上又有所不同,搜索效率也有一定差异,分别讨论如下1。
图 1 整体搜索流程
完整的源码和详细的文档,上传到了 【WRITE-BUG数字空间】,需要的请自取
https://www.writebug.com/code/0c7e5270-c792-11ed-a130-6479f0e5e323/#