算法实验报告:罗密欧与朱丽叶迷宫求解
罗密欧与朱丽叶迷宫课程设计报告精编版

课程设计报告文档题目:罗密欧与朱丽叶的迷宫问题一.任务的描述1.问题描述:罗密欧与朱丽叶的迷宫。
罗密欧与朱丽叶身处一个m×n的迷宫中。
每一个方格表示迷宫中的一个房间。
这m×n个房间中有一些房间是封闭的,不允许任何人进入。
在迷宫中任何位置均可沿8个方向进入未封闭的房间。
罗密欧位于迷宫的(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。
在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。
每改变一次前进方向算作转弯一次。
请设计一个算法帮助罗密欧找出这样一条道路。
对于给定的罗密欧与朱丽叶的迷宫,编程计算罗密欧通向朱丽叶的所有最少转弯道路。
输入数据:第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。
接下来的k行中,每行2 个正整数,表示被封闭的房间所在的行号和列号。
最后的2 行,每行也有2个正整数,分别表示罗密欧所处的方格(p,q)和朱丽叶所处的方格(r,s)。
结果输出: 将计算出的罗密欧通向朱丽叶的最少转弯次数和有多少条不同的最少转弯道路。
文件的第一行是最少转弯次数。
文件的第2 行是不同的最少转弯道路数。
接下来的n行每行m个数,表示迷宫的一条最少转弯道路。
A[i][j]=k表示第k步到达方格(i,j);A[i][j]=-1 表示方格(i,j)是封闭的。
如果罗密欧无法通向朱丽叶则输出“No Solution!”。
输入文件示例4 3 21 23 41 12 2输出文件示例671 -1 9 82 10 6 73 4 5 -12任务目标:(1)确定能对给定的任何位置的罗密欧都能够找到一条通向朱丽叶的路线;(2)程序能够演示一条罗密欧找到朱丽叶的路线过程等。
3.运行环境:vc++6.0二.任务设计1.系统流程图:程序概要的流程图如下:2.函数的划分:(1)函数1:void print() //调用自动显示函数au()和动态显示函数dynamic(),输出一条转弯最少的路径(2)函数2:void search(intdep ,int x,int y,int di); //执行搜索,结果保存在bestb二维数组中,供输出使用(3)函数3:bool consistant(int x ,int y,int dep) //约束剪枝函数(4)函数4:void save(); //save保存找到的最优路线(5)函数5:int StepOk(int x,int y);//用于判断是否越界和可通过(6)函数6:void au()// 自动显示一条路径(7)函数7:void dynamic()//动态显示一条路径(8)函数8:void init()//完成数据输入(9)函数9:int main(); //主函数,调用init()和search()及print(),实现相应的功能3.函数之间的关系:从主函数开始运行,调用init()函数,输入迷宫行数列数封闭房间数,输入罗密欧与朱丽叶坐标后输出迷宫图;然后开始执行搜索函数search(int ,int,int,int),进行搜索,在搜索函数中会调用剪枝函数consistant()和StepOk()及保存函数save(),将路径保存在bestb矩阵当中;由print()函数调用au()和dynamic()函数,将找到的一条路径在屏幕上动态地输出;三.分组情况本人组长负责执行搜索模块,其他两人分别实现自动显示和动态显示四.编写代码1.问题1(1)问题描述:程序需要处理不同的迷宫大小(2)解决办法:可以预先分配很大的内存空间和动态地分配一个矩阵数组给予解决,这里采用动态分配方式,提高空间利用率2.问题2(1)问题描述:执行搜索时,最少转弯数运行结果不对(2)解决办法:反复检查,没能理解题意,第一步应该可以朝任何方向而都不算转弯才对,于是在判断是否转弯时,还得判断是否为第一步才行3.问题3(1)问题描述:执行效率在迷宫较大且可通过房间数很多时低的难以想象(2)解决办法:通过对搜索过程仔细反复研究,进一步挖掘出限制条件,增强剪枝功能,当迷宫较大且封闭房间数较多或较密集时,明显提高了搜索效率五.程序运行1.自动显示功能:2.动态显示功能:六、感想认识通过本次训练,让我体会到这样一个事实,对问题本身掌握的信息越多,就越有可能设计出较好的算法和实现方法,而通用方法比如“万能的”回溯法必须经过具体问题的改造才有可能得到满意的结果;算法设计也得“拳不离手曲不离口”,否则也会生疏而进展缓慢。
迷宫的实验报告

一、实验目的1. 了解迷宫实验的基本原理和方法;2. 探究迷宫实验在心理学研究中的应用;3. 通过迷宫实验,分析被试者的认知能力和决策能力。
二、实验原理迷宫实验起源于古希腊,是一种经典的心理学实验。
实验中,被试者需要在迷宫中找到出口,以此模拟人类在面对复杂环境时的认知过程。
迷宫实验主要考察被试者的空间认知能力、决策能力、记忆能力和心理承受能力等。
三、实验方法1. 实验材料:迷宫卡片、计时器、实验指导语等;2. 实验步骤:(1)被试者随机分组,每组人数为5人;(2)主试者向被试者发放迷宫卡片,并讲解实验规则;(3)被试者按照实验指导语,在规定时间内完成迷宫;(4)记录被试者完成迷宫所需时间、走过的路径和遇到的问题;(5)对实验数据进行统计分析。
四、实验结果与分析1. 实验结果本次实验共收集有效数据100份。
根据实验结果,被试者在迷宫实验中的表现如下:(1)完成迷宫所需时间:平均值为5分钟;(2)走过的路径:大部分被试者能够顺利找到出口,但部分被试者在迷宫中迷失方向;(3)遇到的问题:被试者在迷宫中遇到的问题主要包括路径选择、记忆问题、心理压力等。
2. 实验分析(1)空间认知能力:被试者在迷宫实验中的空间认知能力整体较好,大部分被试者能够顺利找到出口。
但在迷宫中,部分被试者容易迷失方向,说明他们在空间认知方面存在一定程度的不足。
(2)决策能力:在迷宫实验中,被试者需要根据路径选择和记忆来做出决策。
实验结果显示,大部分被试者能够根据迷宫的布局和记忆做出正确的决策,但也有部分被试者在决策过程中出现失误。
(3)记忆能力:迷宫实验对被试者的记忆能力提出了较高要求。
实验结果显示,被试者在迷宫实验中的记忆能力整体较好,但部分被试者在记忆过程中出现遗忘现象。
(4)心理承受能力:在迷宫实验中,被试者需要面对复杂的环境和压力。
实验结果显示,大部分被试者能够保持冷静,但也有部分被试者在心理压力下出现焦虑、烦躁等现象。
五、结论1. 迷宫实验能够有效考察被试者的空间认知能力、决策能力、记忆能力和心理承受能力;2. 在迷宫实验中,被试者的表现受到多种因素的影响,包括个人能力、心理素质等;3. 迷宫实验在心理学研究中的应用具有重要意义,可以为相关研究提供有力支持。
迷宫问题 实验报告

迷宫问题实验报告迷宫问题实验报告引言:迷宫问题一直以来都是计算机科学领域中的研究热点之一。
迷宫是一个具有复杂结构的空间,其中包含了许多死胡同和通道,人们需要找到一条从起点到终点的最短路径。
在这个实验中,我们将通过使用不同的算法和技术来解决迷宫问题,并探讨它们的优缺点。
实验方法:我们首先建立一个虚拟的迷宫模型,使用二维数组来表示。
迷宫包含了墙壁、通道和起点终点。
我们通过设置不同的迷宫大小、起点和终点位置以及障碍物的分布来模拟不同的情况。
1. 广度优先搜索算法:广度优先搜索算法是一种常用的解决迷宫问题的算法。
它从起点开始,逐层地向外扩展搜索,直到找到终点或者遍历完所有的可达点。
在实验中,我们发现广度优先搜索算法能够找到一条最短路径,但是当迷宫规模较大时,算法的时间复杂度会急剧增加,导致搜索时间过长。
2. 深度优先搜索算法:深度优先搜索算法是另一种常用的解决迷宫问题的算法。
它从起点开始,沿着一个方向一直搜索到无法继续前进为止,然后回溯到上一个节点,选择另一个方向进行搜索。
在实验中,我们发现深度优先搜索算法能够快速找到一条路径,但是由于它的搜索策略是“深入优先”,因此无法保证找到的路径是最短路径。
3. A*算法:A*算法是一种启发式搜索算法,它综合了广度优先搜索和深度优先搜索的优点。
在实验中,我们将每个节点的代价定义为从起点到该节点的实际代价和从该节点到终点的预估代价之和。
A*算法通过优先选择代价最小的节点进行搜索,以期望找到一条最短路径。
实验结果表明,A*算法在大多数情况下能够找到最短路径,并且相对于广度优先搜索算法,它的搜索时间更短。
4. 遗传算法:除了传统的搜索算法外,我们还尝试了一种基于进化思想的遗传算法来解决迷宫问题。
遗传算法通过模拟生物进化过程中的选择、交叉和变异等操作来搜索最优解。
在实验中,我们将迷宫路径编码为一个个体,并使用适应度函数来评估每个个体的优劣。
经过多次迭代,遗传算法能够找到一条较优的路径,但是由于算法本身的复杂性,搜索时间较长。
算法分析与设计

表中有些数字已经显露出来,还有些用?和*代替。 请你计算出? 和 * 所代表的数字。并把 * 所代表的数字作为本题答 案提交。
素数环问题
素数环是一个计算机程序问题,指的是将从1到n这n个整数围成一 个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环 就成为素数环。现在要求输入一个n,求n个数围成一圈有多少种素数 环,规定第一个数字是1。 143256 165234
例如当n=5,m=4时,面值为1,3,11,15,32的5种邮票可以贴 出邮资的最大连续区间是1到70。
➢ 通用的解题法 ➢ 核心在于构造解空间树:
➢ 子集树 ➢ 排列树 ➢ 回溯法是优化的暴力搜索: ➢ 不满足限制条件; ➢ 当前解与最优解进行预计算; ➢ 学习回溯法:心中有树
回溯法
总结
➢ 动态规划适合两个连续步骤之间有联系的问题; ➢ 回溯法几乎适用于所有的问题,但问题之间最好有明确的层次。
总结
➢ 构造心中的解空间树是关键; ➢ 回溯法与函数的局部变量; ➢ 访问解空间树的优化处理;
迷宫问题中的回溯法
➢ 四邻域 ➢ 八邻域
图论问题
无向图: ➢ 连通 ➢ 不连通
有向图: ➢ 弱连通 ➢ 单向连通 ➢ 强连通
最大团问题
连通子图(分支)
最大团问题
给定无向图G=(V,E),如果UV,且对任意的u,vU, 都有(u,v)E,则称U是G的完全子图。G的完全子图U是G 的一个团当且仅当U不包含在G的更大的完全子图中。G中 的最大团是指G中所含顶点数最多的团。
yes no yes
➢ 通用的解题法 ➢ 核心在于构造解空间树:
迷宫问题求解算法设计实验报告

迷宫问题求解算法设计实验报告一、引言迷宫问题一直是计算机科学中的一个经典问题,其解决方法也一直是研究者们探讨的重点之一。
本实验旨在通过设计不同的算法,对迷宫问题进行求解,并对比不同算法的效率和优缺点。
二、算法设计1. 暴力搜索算法暴力搜索算法是最简单直接的求解迷宫问题的方法。
其基本思路是从起点开始,按照某种规则依次尝试所有可能的路径,直到找到终点或所有路径都被尝试过为止。
2. 广度优先搜索算法广度优先搜索算法也称为BFS(Breadth First Search),其基本思路是从起点开始,按照层次依次遍历每个节点,并将其相邻节点加入队列中。
当找到终点时,即可得到最短路径。
3. 深度优先搜索算法深度优先搜索算法也称为DFS(Depth First Search),其基本思路是从起点开始,沿着某一个方向走到底,再回溯到上一个节点继续向其他方向探索。
当找到终点时,即可得到一条路径。
4. A* 算法A* 算法是一种启发式搜索算法,其基本思路是综合考虑节点到起点的距离和节点到终点的距离,选择最优的路径。
具体实现中,可以使用估价函数来计算每个节点到终点的距离,并将其加入优先队列中。
三、实验过程本实验使用 Python 语言编写程序,在不同算法下对迷宫问题进行求解。
1. 数据准备首先需要准备迷宫数据,可以手动输入或从文件中读取。
本实验使用二维数组表示迷宫,其中 0 表示墙壁,1 表示路径。
起点和终点分别用 S 和 E 表示。
2. 暴力搜索算法暴力搜索算法比较简单直接,只需要按照某种规则遍历所有可能的路径即可。
具体实现中,可以使用递归函数来实现深度遍历。
3. 广度优先搜索算法广度优先搜索算法需要使用队列来存储待遍历的节点。
具体实现中,每次从队列中取出一个节点,并将其相邻节点加入队列中。
4. 深度优先搜索算法深度优先搜索算法也需要使用递归函数来实现深度遍历。
具体实现中,在回溯时需要将已经访问过的节点标记为已访问,防止重复访问。
迷宫求解实验报告

迷宫求解实验报告迷宫求解实验报告引言:迷宫作为一种经典的智力游戏,一直以来都备受人们的喜爱。
在这个实验中,我们尝试使用计算机算法来解决迷宫问题。
通过设计并实现一个迷宫求解程序,我们将探索不同的算法和策略,以找到最佳路径解决迷宫。
实验设计:我们首先定义了迷宫的基本结构。
迷宫由一个二维矩阵表示,其中0代表通路,1代表墙壁。
我们使用了一个常见的5x5迷宫作为实验样本,其中包括了起点和终点。
接下来,我们尝试了两种不同的算法来解决迷宫问题。
算法一:深度优先搜索(DFS)深度优先搜索是一种常见的图搜索算法,在解决迷宫问题中也有广泛的应用。
该算法从起点开始,沿着一个路径一直向前探索,直到遇到死路或者到达终点。
如果遇到死路,则回溯到上一个节点,继续探索其他路径,直到找到一条通往终点的路径。
我们实现了一个递归函数来实现深度优先搜索算法。
通过不断调用该函数,我们可以找到一条从起点到终点的路径。
然而,由于深度优先搜索的特性,它并不能保证找到最短路径。
在我们的实验中,深度优先搜索找到的路径长度为8步。
算法二:广度优先搜索(BFS)广度优先搜索是另一种常见的图搜索算法,与深度优先搜索不同的是,它优先探索所有的相邻节点,再逐层向外扩展。
在解决迷宫问题时,广度优先搜索可以保证找到最短路径。
我们使用了一个队列数据结构来实现广度优先搜索算法。
通过不断将相邻节点加入队列,并记录每个节点的前驱节点,我们可以在找到终点后,追溯回起点,从而找到最短路径。
在我们的实验中,广度优先搜索找到的路径长度为6步。
实验结果:通过对比深度优先搜索和广度优先搜索的结果,我们可以看出广度优先搜索算法在解决迷宫问题时更加高效。
虽然深度优先搜索算法可以找到一条路径,但它并不能保证是最短路径。
而广度优先搜索算法通过逐层扩展的方式,可以保证找到的路径是最短的。
讨论与总结:通过这个实验,我们不仅学习了迷宫求解的基本算法,还深入了解了深度优先搜索和广度优先搜索的原理和应用。
算法实验报告:罗密欧与朱丽叶迷宫求解

河南科技大学课程设计报告课程名称:算法设计与分析设计题目:罗密欧与朱丽叶迷宫求解问题院系:电子信息工程学院专业:计算机科学与技术班级:计算机092班河南科技大学课程设计任务书课程名称:算法设计与分析题目:罗密欧与朱丽叶迷宫求解问题院系:电子信息工程学院班级:计算机科学与技术092班学生姓名: *** 指导教师:孙士保、张明川、冀治航起止日期: 2011年5月28日 - 2011年6月3日目录第一章需求分析 (5)1.1 课程设计题目 ........................................................................................................... (5)1.2 课程设计任务及要求 (5)1.3 软硬件运行环境及开发工具 (5)第二章程序概要设计 (2)2.1 系统流程图....................................................................................................... .........错误!未定义书签。
2.2 函数的划分.......................................................................................................错误!未定义书签。
2.3函数之间的关系 (3)第三章编写代码及运行程序 (3)3.1源程序 (3)3.2操作及运行结果 (6)3.3设计的心得体会 (7)第一章需求分析1.1课程设计题目对于给定的罗密欧与朱丽叶的迷宫,编程计算罗密欧通向朱丽叶的所有最少弯道路程序能够演示一条罗密欧找到朱丽叶的路线过程等1.2 课程设计任务及要求罗密欧与朱丽叶的迷宫。
罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示。
迷宫问题

算法设计与分析课程设计罗密欧与朱丽叶的迷宫问题设计分析测试报告程序算法设计说明书一、前言1、题目:罗密欧与朱丽叶的迷宫问题。
罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示。
每一个方格表示迷宫中的一个房间。
这m×n个房间中有一些房间是封闭的,不允许任何人进入。
在迷宫中任何位置均可沿8 个方向进入未封闭的房间。
罗密欧位于迷宫的(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。
在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。
每改变一次前进方向算作转弯一次。
请设计和实现一个算法帮助罗密欧找出这些道路。
2、程序编制环境相关说明硬件:装有windows操作系统的计算机软件:Visual C++ 2008二、程序主要算法设计分析说明1、算法设计思路用回溯法解迷宫问题时,用排列树表示其解空间比较合适。
可行性约束函数减去不满足约束条件(x,y,z)已越界的子树。
在排列树的第i+1层节点z处用board[z][x][y]记载所在的房间。
当bool stepok(int x,int y,int z)返回为false时,以z为根的子树中所有子树都不满足约束条件,因而该子树中的解均为不可行解,故可将该子树剪枝。
算法调用递归方法void backtrack(int dep,int x,int y,int di)实现回溯搜索。
void backtrack (int dep,int x,int y,int di)搜索排列树中第dep层子树。
数组board[0][x][y]记录排列树中的节点信息。
dirs记录当前节点对应的转弯数, best记录最少转弯数。
在算法void backtrack (int dep,int x,int y,int di)中,当i>n时,算法搜索至叶节点,其相应的转弯数dirs。
如果dirs>best,则表示当前解优于最优解,此时更新best。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
河南科技大学课程设计报告课程名称:算法设计与分析设计题目:罗密欧与朱丽叶迷宫求解问题院系:电子信息工程学院专业:计算机科学与技术班级:计算机092班学生姓名:学号:09************起止日期: 2011年5月28日 - 2011年6月3日指导教师:孙士保、张明川、冀治航课程设计题目罗密欧与朱丽叶的迷宫问题姓名*** 学号091040602** 班级092班系别电子信息工程学院专业计算机科学与技术组别1人组长***组员***指导教师姓名孙士保、张明川、冀治航课程设计目的进一步巩固C程序设计和算法设计与分析的基础知识,提升结构化程序、模块化程序设计的方法和能力,深入理解数据结构的基本理论,掌握数据存储结构的设计方法,掌握基于数据结构的各种操作的实现方法,训练对基础知识和基本方法的综合运用能力,增强对算法的理解能力,提高软件设计能力。
在实践中培养独立分析问题和解决问题的作风和能力。
设计环境1. PC兼容机 2.Windows 2000/XP操作系统3.TC集成开发环境或其他C语言开发环境课程设计要求和任务要求:1.熟练掌握回溯法,能够利用回溯法解决实际问题;2.使用文件进行存储和管理。
程序启动时可从文件中读取信息,或从键盘输入信息;运行过程中也可对文件进行存取;退出前可选择将部分信息保存到文件中;3.不同的功能使用不同的函数实现(模块化),对每个函数的功能和调用接口要注释清楚。
对程序其它部分也进行必要的注释。
4.对系统进行功能模块分析、画出总流程图和各模块流程图;5.用户界面要求使用方便、简洁明了、美观大方、格式统一。
所有功能可以反复使用,最好使用菜单;6.通过命令行相应选项能直接进入某个相应菜单选项的功能模块;7.所有程序需调试通过。
任务:完成罗密欧与朱丽叶的迷宫问题.设计内容包括:1.确定能对给定的任何位置的罗密欧都能够找到一条通向朱丽叶的路线;2.程序能够演示一条罗密欧找到朱丽叶的路线过程等。
课程设计工作进度计划序号起止日期工作内容1 下发任务书,分组,选定课题,查阅相关资料2 总体设计,划分模块3 编制源程序4 上机调试,修改、完善系统5 程序检查6 撰写说明书河南科技大学课程设计任务书课程名称:算法设计与分析题目:罗密欧与朱丽叶迷宫求解问题院系:电子信息工程学院班级:计算机科学与技术092班学生姓名: *** 指导教师:孙士保、张明川、冀治航起止日期: 2011年5月28日 - 2011年6月3日目录第一章需求分析 (5)1.1 课程设计题目 ........................................................................................................... (5)1.2 课程设计任务及要求 (5)1.3 软硬件运行环境及开发工具 (5)第二章程序概要设计 (2)2.1 系统流程图....................................................................................................... .........错误!未定义书签。
2.2 函数的划分.......................................................................................................错误!未定义书签。
2.3函数之间的关系 (3)第三章编写代码及运行程序 (3)3.1源程序 (3)3.2操作及运行结果 (6)3.3设计的心得体会 (7)第一章需求分析1.1课程设计题目对于给定的罗密欧与朱丽叶的迷宫,编程计算罗密欧通向朱丽叶的所有最少弯道路程序能够演示一条罗密欧找到朱丽叶的路线过程等1.2 课程设计任务及要求罗密欧与朱丽叶的迷宫。
罗密欧与朱丽叶身处一个m×n的迷宫中,如图所示。
每一个方格表示迷宫中的一个房间。
这m×n个房间中有一些房间是封闭的,不允许任何人进入。
在迷宫中任何位置均可沿8 个方向进入未封闭的房间。
罗密欧位于迷宫的。
(p,q)方格中,他必须找出一条通向朱丽叶所在的(r,s)方格的路。
在抵达朱丽叶之前,他必须走遍所有未封闭的房间各一次,而且要使到达朱丽叶的转弯次数为最少。
每改变一次前进方向算作转弯一次。
请设计一个算法帮助罗密欧找出这样一条路。
1.3 软硬件运行环境及开发工具硬件:装有windows操作系统的计算机软件:Visual C++6.0第二章 程序概要设计2.1 系统流程图2.2函数的划分:(1)函数1:bool trackback (int x,int y) 递归调用trackback 函数求出最优路径。
(2)函数2:void isfull() 判断房间是否全部走完(3)函数3:void main() 主函数初始化迷宫数组,并调用trackback 函数输出一条迷宫路线。
输入m,n,k,p,q,r,s-1->dirs count->0dep=m*n-k&&x=r&&y=s&&dirs<=best是 否dep=m*n-k||x=r &&y=s||dirs>best是 否 dirs<best是 否 Count+1->count best=dirs;count=1;1-.>i 1->j bestw[i][j]=board[i][j]+1->j 直到j<=n i=i->i直到i<=m zzhaireturn return1->ip=x+dir[i][0] q=y+dir[i][1] x>0&&x<=m&& y>0&& y<=n&& board[x][y]=0 是di!=i 是 dirs-1->dirs board[p][q]=0; board[p][q]=dep +1 di!=idirs+1->dis 直到ri<=8输出best ,count **bestw2.3.函数之间的关系:如下图:main函数isfull函数调用trackbask函数递归调用trackbask函数输出结果第三章编写代码及运行程序3.1源程序#include <iostream.h>int m,n,k;//m*n迷宫,k个封闭房间int x,y;//迷宫中封闭房间的坐标int p,q,r,s;//罗密欧与朱丽叶的坐标int **square;//存储迷宫int *dir;//用来记录每一步的方向int level(0);//记录正在探测第几步int finalLevel(0);//初始化为零int **result;//记录结果int **path;int turn(999);//记录最小拐弯数int dirx[8]={0,0,1,1,1,-1,-1,-1};//8个方向变量int diry[8]={1,-1,-1,0,1,-1,0,1};bool trackback(int p,int q );bool IsFull();void main(){int i, j;cin >> m >> n >> k;result = new int *[2];result[0] = new int [n*m];result[1] = new int [n*m];path = new int *[2];path[0] = new int [n*m];path[1] = new int [n*m];dir = new int [m*n];square = new int *[m+2];//m+2是为了方便边界处理for ( i=0; i<m+2; i++ ){square[i]=new int [n+2];//n+2是也是为了方便边界处理}for(i=0; i<m+2; i++)//初始化square迷宫for(j=0; j<n+2; j++)square[i][j]=0;for(i=0; i<k; i++){//输入封闭房间的坐标,并使房间封闭cin>>x>>y;square[x][y]=-1;}//=================边界处理===================== for ( i=0, j=0; i<m+2; i++ )square[i][j] = 1;for ( i=0, j=0; j<n+2; j++ )square[i][j] = 1;for ( i=m+1,j=0; j<n+2; j++ )square[i][j] = 1;for ( j=n+1,i=0; i<m+2; i++ )square[i][j] = 1;//============================================== //输入罗密欧的坐标(p,q)和朱丽叶的坐标(r,s)cin>>p>>q>>r>>s;dir[0] = -1;//方向初始化trackback( p, q );//回溯cout << turn - 1 << endl;//输出转弯数for ( i = 0; i < finalLevel; i++ )square[result[0][i]][result[1][i]] = i + 1;for ( i = 1; i < m + 1; i++)//打印迷宫{for( int j = 1; j < n + 1; j++)cout << square[i][j] << ' ';cout << endl;}}bool trackback(int p,int q ){//回溯过程//===========将p、q放入path中===============path[0][level]=p;path[1][level]=q;level++;//走出一步square[p][q] = 1;//标记起点已经走过//==========================================if ( p == r && q == s ){//找到朱丽叶后求转弯数,最小者保存之if ( IsFull() ){//如果所有房间已经走过int count(0);for ( int i = 1; i < level; i++ )if ( dir[i] != dir[i-1] ) count++;//若下一次的方向不同于上一次的方向,判定为一次转弯if ( count < turn ){//找出最小转弯数并保存之finalLevel = level;//记录最后的步数turn = count;for ( int i = 0; i < level; i++ ){//保存最优路径result[0][i] = path[0][i];result[1][i] = path[1][i];}}}square[p][q] = 0;//若已经找到朱丽叶房间未走完,则重新置起点为0 level--;//后退return false;//该路径不是答案,剪掉该子树}//退出找到朱丽叶的状态for ( int i = 0; i < 8; i++ ){//以下是未找到朱丽叶的状态向八个方向搜索int x, y;x = p + dirx[i];y = q + diry[i];if ( square[x][y] == 0 ){//若该房间没进入过,则标记其方向并进一步搜索dir[level] = i;trackback( x, y);}}square[p][q] = 0; //回到上一步level--;//回到上一步return true;//不需剪掉该子树}bool IsFull(){//判断是否走满每个房间for ( int i = 1; i <= m; i++ )for ( int j= 1; j <= n; j++ )if ( square[i][j] == 0 )return false;return true;}3.2操作及运作结果输入输出并显示迷宫结果如下:3.4设计的心得体会通过本次课程设计的训练,增加了我学习算法的兴趣,虽然还不是很明白其中的具体内容,但已发现算法分析与程序设计的乐趣。