数据结构课程设计报告_马踏棋盘

合集下载

数据结构 马踏棋盘 设计报告

数据结构 马踏棋盘 设计报告

《数据结构》课程设计报告课程名称:《数据结构》课程设计课程设计题目:姓名:院系:专业:年级:学号:指导教师:2011年月日目录1、程序设计的目的2、设计题目3、分析4、设计思想5、算法6、测试结果7、调试分析8、小结1、课程设计的目的1、熟练使用C++语言编写程序,解决实际问题;2、了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;3、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;4、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;5、学习并熟悉栈的有关操作;6、利用栈实现实际问题;2、设计题目【马踏棋盘】*问题描述:将马随机放在国际象棋的8X8棋盘Bo阿rd[0..7,0..7]的某个方格中,马按走棋规则进行移动。

要求每个方格上只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵输出之。

*测试数据:由读者指定,可自行指定一个马的初始位置。

*实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

3、分析确定输入值的范围,输入马的初始行坐标X和Y,X和Y的范围都是1到8之间。

程序的功能是输出马走的步骤,要使马从任一起点出发,通过程序能找到下一个地点,然后遍历整个棋盘。

每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

输出时可以用二维数组。

4、设计思想输入马初始位置的坐标。

将初始位置进栈,经过一个while循环,取出符合条件的栈顶元素。

利用函数,找出栈顶元素周围未被占用的新位置,如果有,新位置入栈;否则弹出栈顶元素。

C++ 数据结构课程设计 马踏棋局文档

C++ 数据结构课程设计 马踏棋局文档

课程设计题目1 问题描述将马随机放在国际象棋的8*8棋盘Board[8][8]的某个方格中,马按走棋规则进行移动,要求每个方格上只进入一次,走遍棋盘上全部64个方格2 基本要求(1)采用图形界面实现该游戏。

(2)从键盘输入马的初始位置。

(3)编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8* 8的方阵,并输出之。

3系统分析与设计3.1 数据结构逻辑结构为线性结构,用顺序栈。

坐标点用已结构体来表示,并将其的位置放在s[step]的栈中,而且将每走一步的坐标放在另一栈s1中3.2 算法设计1.程序框架及功能模块划分:2.设计功能的分析与实现void exit(point p)参数:point功能:计算出下一步可能位置,按其各个位置下一个位置的和压栈到s[]中算法描述:接受参数传来的值,按次序加上int horizontal[]={2,1,-1,-2,-2,-1,1,2};int vertical[]={-1,-2,-2,-1,1,2,2,1};再根据legal函数来判断是否合法(x(0~7),y(0~7))是,则保存在point ap[]中,再按各自下一步的数目从大到小排序。

最后,将ap[]中的点压栈。

int number(point p)参数:point功能:找出当前位置下一步的各种可能位置,计算可能之和算法描述:接受参数传来的值,按次序加上int horizontal[]={2,1,-1,-2,-2,-1,1,2};int vertical[]={-1,-2,-2,-1,1,2,2,1};再根据legal函数来判断是否合法(x(0~7),y(0~7))是,则加1并将值返回void next(point p)参数:point功能:/找出各个位置并将其步数记录算法描述:将其步数记录在board[][]的相应位置,并将这点压栈到s1,判断步数是否小于64,再根据这四个条件选择执行其中的一个,再递归调用next.bool legal(point p)参数:point功能:判断是否可行,合法(是否在棋盘上,是否走过)算法描述:用这样的语句if((p.x>=0)&&(p.x<n)&&(p.y<n)&&(p.y>=0)&&(bo ard[p.x][p.y]==0))return true;elsereturn false;4 测试数据及结果测试数据和运行输出及结果分析输入x(0-7),y(0-7)0 01 34 3 18 49 32 13 164 19 56 33 14 17 50 3157 2 35 48 55 52 15 1220 5 60 53 36 47 30 5141 58 37 46 61 54 11 266 21 42 59 38 27 64 2943 40 23 8 45 62 25 1022 7 44 39 24 9 28 63 Press any key to continue输入x(0-7),y(0-7)0 9输入不合法,重输入!输入x(0-7!),y(0-7!)4 530 27 10 49 40 25 8 511 48 29 26 9 6 39 2428 31 56 45 50 41 4 747 12 51 42 19 44 23 3832 57 46 55 52 1 18 313 64 53 60 43 20 37 2258 33 62 15 54 35 2 1763 14 59 34 61 16 21 36 Press any key to continue5 总结调试过程中遇到的主要问题,是如何解决的;问题1:只走到63步原因:第64步就走完了,并且s[62]中只有一个元素,这个判断条件(s[step].base==s[step].top&&number(p2)==0)满足就进入了,而始终不能走完解决方法:改了判断条件,改为((s[step].base==s[step].top&&number(p2)==0)&&step!=n* n-1)解决方案:用InitStack(s1)初始化问题3:冒泡排序超出边界原因:循环次数大解决方案:减少循环次数看了其他同学,都差不多,我已经按马的下一位置最难的先走,再走难度次之的位置。

马踏棋盘实习报告

马踏棋盘实习报告

一、实习背景马踏棋盘问题是一个经典的算法问题,也是数据结构课程中的一个重要实验。

通过对马踏棋盘问题的研究和实现,可以加深对栈和队列这两种抽象数据类型的理解,提高算法设计能力和编程能力。

本次实习旨在通过编程实现马踏棋盘问题,并分析其算法的复杂度和优化策略。

二、实习目的1. 理解马踏棋盘问题的背景和意义;2. 掌握栈和队列的应用,以及它们在解决实际问题中的作用;3. 提高算法设计能力和编程能力;4. 分析马踏棋盘问题的算法复杂度,并尝试优化算法。

三、实习内容1. 马踏棋盘问题介绍马踏棋盘问题是指在8x8的国际象棋棋盘上,将一匹马随机放在棋盘上的一个位置,然后按照国际象棋的走法,即“日”字形移动,使得马能够走遍棋盘上的所有方格。

要求使用非递归的方式实现。

2. 栈和队列的应用在解决马踏棋盘问题时,我们可以使用栈来存储马走过的路径,使用队列来实现广度优先搜索(BFS)策略,以寻找马的所有可能走法。

3. 算法实现(1)初始化棋盘和路径栈首先,我们需要初始化一个8x8的二维数组来表示棋盘,并将起始位置设置为(0,0)。

同时,创建一个栈来存储马走过的路径。

(2)定义马的移动规则根据国际象棋的规则,马可以走到以下八个位置之一:(-2,-1),(-2,1),(-1,-2),(-1,2),(1,-2),(1,2),(2,-1),(2,1)在实现时,我们需要判断这些位置是否在棋盘范围内,以及是否已经走过。

(3)广度优先搜索使用队列来实现广度优先搜索策略,从起始位置开始,按照BFS的顺序,依次尝试马的所有可能走法。

每走一步,就将新的位置压入栈中,并更新队列。

(4)输出结果当队列中所有位置都尝试过一遍后,栈中的路径即为马的行走路线。

按照路径输出棋盘上的数字,即可得到最终结果。

4. 算法优化为了提高算法的效率,我们可以考虑以下优化策略:(1)使用邻接矩阵来表示棋盘,减少重复计算;(2)在遍历队列时,优先考虑距离起始位置较近的位置;(3)在遍历过程中,避免重复访问已经访问过的位置。

数据结构课程设计-马踏棋盘实验报告(仅供参考)

数据结构课程设计-马踏棋盘实验报告(仅供参考)

一、问题描述问题描述:将马随机放在国际象棋的8X8棋盘Bo阿rd[0..7,0..7]的某个方格中,马按走棋规则进行移动。

要求每个方格上只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵输出之。

测试数据:由读者指定,可自行指定一个马的初始位置。

实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

二、实验目的熟练使用栈和队列解决实际问题;(1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(2)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;三、设计过程算法设计思想:根据分析先建了2个结构体struct PosType //马的坐标位置类型{int m_row; //行值int m_col; //列值};struct DataType //栈的元素类型8 17 26 35 4{PosType seat; //马在棋盘中的“坐标位置”int di; //换方向的次数};chess::chess()bool chess::chessPath(PosType start) //在棋盘中进行试探寻找下一步位置并同时记录位置,以及涉及到的入栈出栈void chess::Print() //打印马走的路径PosType chess::NextPos(PosType a,int di)//根据当前点的位置a和移动方向di,试探下一位置(1)、位置的存储表示方式typedef struct{int x;int y;int from;}Point;(2)、栈的存储方式#define STACKSIZE 70#define STACKINCREASE 10typedef struct Stack{Point *top;Point *base;int stacksize;};(3)设定栈的抽象数据类型定义:ADT Stack {数据对象:D={a i | a i∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<a i-1 , a i>|a i-1, a i∈D,i=2,…,n}约定a n端为栈顶,a i端为栈顶。

数据结构课程设计 马踏棋盘分解

数据结构课程设计 马踏棋盘分解

杭州师范大学钱江学院课程设计2013 年12 月21 日目录一.概述 (3)二.总体方案设计 (3)三.详细设计 (4)四.最终输出 (6)五.课程设计总结 (10)参考文献 (13)一概述1.课程设计的目的(1)课题描述设计一个国际象棋的马踏遍棋盘的演示程序。

(2)课题意义通过“马踏棋盘”算法的研究,强化了个人对“栈”数据结构的定义和运用,同时也锻炼了自身的C语言编程能力。

另一方面,通过对“马踏棋盘” 算法的研究,个人对“迷宫”、“棋盘遍历”一类的问题,有了深刻的认识,为今后解决以此问题为基础的相关的问题,打下了坚实的基础。

(3)解决问题的关键点说明解决问题的关键首先要熟练掌握 C语言编程技术,同时能够熟练运用“栈”数据结构。

另外,态度也是非常重要的。

在课程设计过程中,难免会遇到困难,但是不能轻易放弃,要肯花时间,能静得下心,积极查阅相关资料,积极与指导老师沟通。

2.课程设计的要求(1)课题设计要求将马随机放在国际象棋的8X 8棋盘Board[0〜7][0〜7]的某个方格中,马按走棋规则进行移动。

要求每个方格只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8X 8的方阵,输出之。

程序由回溯法和贪心法实现,比较两种算法的时间复杂度。

(2)课题设计的思路首先,搞清楚马每次在棋盘上有 8个方向可走,定义两个一位数组,来存储马下一着点的水平和纵向偏移量。

程序再定义一个8*8二维数组,初始所有元素置0,起始点元素置1。

若为回溯法,初始方向数据(一维数组下标) 入栈。

随后,马从起始点开始,每次首先寻找下一可行的着点,然后记下方向,方向数据入栈,把该位置元素置为合适的序列号,若无下一可行着点,则回溯,寻找下一方向位置着点,以此类推,直到 64填入数组中,则输出二维数组,即为马可走的方案。

若为贪婪法,选择下一出口的贪婪标准是在那些允许走的位置中,选择出口最少的那个位置。

实验报告马踏棋盘

实验报告马踏棋盘

2.4题马踏棋盘题目:设计一个国际象棋的马踏棋盘的演示程序班级::学号:完成日期:一.需求分析(1)输入的形式和输入值的围:输入马的初始行坐标X和列坐标Y,X和Y的围都是[1,8]。

(2)输出形式:以数组下表的形式输入,i为行标,j为列标,用空格符号隔开。

以棋盘形式输出,每一格打印马走的步数,这种方式比较直观(3)程序所能达到的功能:让马从任意起点出发都能够遍历整个8*8的棋盘。

(4)测试数据,包括正确输入及输出结果和含有错误的输入及其输出结果。

数据可以任定,只要1<=x,y<=8就可以了。

正确的输出结果为一个二维数组,每个元素的值表示马行走的第几步,若输入有错,则程序会显示:“输入有误!请重新输入……”并且要求用户重新输入数据,直至输入正确为止。

二.概要设计(1)、位置的存储表示方式(2) typedef struct {int x;int y;int from;}Point;(2)、栈的存储方式#define STACKSIZE 70#define STACKINCREASE 10typedef struct Stack {Point *top;Point *base;int stacksize;};(1)、设定栈的抽象数据类型定义: ADT Stack {数据对象:D={ai | ai∈ElemSet,i=1,2,…,n,n≥0}数据关系:R1={<ai-1 , ai>|ai-1, ai∈D,i=2,…,n} 约定an端为栈顶,ai端为栈顶。

基本操作:InitStack(&s)操作结果:构造一个空栈s,DestroyStack(&s)初始条件:栈s已存在。

操作结果:栈s被销毁。

ClearStack(&s)初始条件:栈s已存在。

操作结果:栈s清为空栈。

StackEmpty(&s)初始条件:栈s已存在。

操作结果:若栈s为空栈,则返回TRUE,否则返回FALSE。

数据结构马踏棋盘

数据结构马踏棋盘

数据结构马踏棋盘第一点:马踏棋盘的起源与发展马踏棋盘,是一种源自中国传统的棋类游戏,具有悠久的历史和丰富的文化内涵。

它是在象棋的基础上演变而来的一种棋类运动,以马作为主要棋子,通过马的移动来占领对方的棋盘。

马踏棋盘不仅具有高度的策略性和技巧性,而且蕴含着深厚的哲学思想和人生哲理。

从历史角度看,马踏棋盘的起源可以追溯到中国古代的战国时期。

当时,诸侯割据,战争频繁,人们为了娱乐和消磨时间,便创造了这种棋类游戏。

随着时间的推移,马踏棋盘逐渐在全国各地流传开来,并逐渐形成了不同的地域流派和玩法。

从文化角度看,马踏棋盘不仅是一种游戏,更是一种艺术。

它的棋盘布局、棋子造型、规则设计等方面都蕴含着丰富的中国传统文化元素。

例如,棋盘的布局模仿了中国古代的宫殿建筑,棋子的造型则借鉴了古代兵器和宫廷用品。

同时,马踏棋盘的规则设计也体现了中国古代的哲学思想,如阴阳、五行等。

第二点:马踏棋盘的策略与技巧马踏棋盘作为一种策略性棋类游戏,其胜负往往取决于玩家的策略和技巧。

在游戏中,玩家需要充分运用自己的智慧和思维,通过巧妙的布局和战术,来实现占领对方棋盘的目的。

首先,玩家需要掌握马踏棋盘的基本规则和棋子的行走方式。

马踏棋盘的棋子行走方式与象棋有所不同,马的移动方式是“日”字形,即每次移动可以横向或纵向移动一格,然后横向或纵向移动一格,类似于马的奔腾。

玩家需要熟练掌握马的行走方式,才能在游戏中更好地发挥其作用。

其次,玩家需要学会运用不同的战术和策略。

在马踏棋盘游戏中,玩家可以通过设置陷阱、封锁对方棋子、保护自己的棋子等方式来达到胜利的目的。

例如,玩家可以利用棋盘上的障碍物来设置陷阱,让对方棋子无法移动或被迫移动到不利的位置。

同时,玩家还需要保护自己的棋子,避免被对方轻易攻破。

最后,玩家需要具备良好的思维和应变能力。

在马踏棋盘游戏中,局势变化无常,玩家需要能够迅速分析局势,制定出合理的策略和方案。

同时,玩家还需要具备较强的应变能力,能够灵活应对各种突发情况,从而取得胜利。

马踏棋盘课程设计实验报告

马踏棋盘课程设计实验报告

马踏棋盘课程设计实验报告《数据结构》课程设计实验报告课程名称: 《数据结构》课程设计课程设计题目: 马踏棋盘姓名: 邱可昉院系: 计算机学院专业: 计算机科学与技术班级: 10052313 学号: 10051319 指导老师: 王立波2012年5月18日1目录1.课程设计的目的...............................................................3 2.问题分析........................................................................3 3.课程设计报告内容 (3)(1)概要设计 (3)(2)详细设计 (3)(3)测试结果 (5)(4)程序清单...............................................................6 4.个人小结 (10)21.课程设计的目的《数据结构》是计算机软件的一门基础课程,计算机科学各领域及有关的应用软件都要用到各种类型的数据结构。

学好数据结构对掌握实际编程能力是很有帮助的。

为了学好《数据结构》,必须编写一些在特定数据结构上的算法,通过上机调试,才能更好地掌握各种数据结构及其特点,同时提高解决计算机应用实际问题的能力。

2.问题分析*问题描述:将马随机放在国际象棋的8X8棋盘Bo阿rd[0..7,0..7]的某个方格中,马按走棋规则进行移动。

要求每个方格上只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵输出之。

*测试数据:由读者指定,可自行指定一个马的初始位置。

*实现提示:每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。

并探讨每次选择位置的“最佳策略”,以减少回溯的次数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

.杭州师范大学钱江学院课程设计题目马踏棋盘算法研究教学院信息与机电工程分院专业计算机科学与技术班级计算机1201姓名吴秋浩指导教师王李冬2013 年12 月21 日目录一.概述 (3)二.总体方案设计 (3)三.详细设计 (4)四.最终输出 (7)五.课程设计总结 (11)参考文献 (15)一概述1.课程设计的目的(1)课题描述设计一个国际象棋的马踏遍棋盘的演示程序。

(2)课题意义通过“马踏棋盘”算法的研究,强化了个人对“栈”数据结构的定义和运用,同时也锻炼了自身的C语言编程能力。

另一方面,通过对“马踏棋盘”算法的研究,个人对“迷宫”、“棋盘遍历”一类的问题,有了深刻的认识,为今后解决以此问题为基础的相关的问题,打下了坚实的基础。

(3)解决问题的关键点说明解决问题的关键首先要熟练掌握C语言编程技术,同时能够熟练运用“栈”数据结构。

另外,态度也是非常重要的。

在课程设计过程中,难免会遇到困难,但是不能轻易放弃,要肯花时间,能静得下心,积极查阅相关资料,积极与指导老师沟通。

2.课程设计的要求(1)课题设计要求将马随机放在国际象棋的8×8棋盘Board[0~7][0~7]的某个方格中,马按走棋规则进行移动。

要求每个方格只进入一次,走遍棋盘上全部64个方格。

编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入一个8×8的方阵,输出之。

程序由回溯法和贪心法实现,比较两种算法的时间复杂度。

(2)课题设计的思路首先,搞清楚马每次在棋盘上有8个方向可走,定义两个一位数组,来存储马下一着点的水平和纵向偏移量。

程序再定义一个8*8二维数组,初始所有元素置0,起始点元素置1。

若为回溯法,初始方向数据(一维数组下标)入栈。

随后,马从起始点开始,每次首先寻找下一可行的着点,然后记下方向,方向数据入栈,把该位置元素置为合适的序列号,若无下一可行着点,则回溯,寻找下一方向位置着点,以此类推,直到64填入数组中,则输出二维数组,即为马可走的方案。

若为贪婪法,选择下一出口的贪婪标准是在那些允许走的位置中,选择出口最少的那个位置。

直到没有下一着点位置,若此时已标记到64,则找到可行方案,输出之。

反之,改变初始寻找方向继续寻找,直到8种方向顺序都试过,若还是没有合适的方案,则说明以该起始点开始马无法踏遍棋盘。

二总体方案设计1.回溯法算法思想按深度优先策略,从一条路往前走,能进则进,不能进则退回来,换一条路再试,也就是说每当前进的路不通,我们总是返回到前一次的岔路口,选择下一条新的路线。

(1)函数头文件定义和宏定义#include<stdio.h>#include<stdlib.h>#define N 8 //便于改变棋盘大小(2)栈数据结构定义typedef struct{int b[N*N]; //记录每次走的方向int top; //栈指针}SqStack;(3)定义探寻路径函数Board[N][N]模拟N*N棋盘,填入1,2,3···64。

x、y传递初始位置。

bool HorsePath(int Board[][N],int x,int y){// 初始化栈//定义方向数组//int xx[8]={1,2,2,1,-1,-2,-2,-1};//int yy[8]={2,1,-1,-2,-2,-1,1,2};//初始方向下表入栈//回溯法开始寻找合适方案(详见“详细设计”)}(4)定义主函数void main(){//定义基本变量及Board[N][N]数组//输入初始位置x0,y0//调用HorsePath(Board,x0,y0);//输出方案}2.贪心法算法思想从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。

当达到某算法中的某一步不能再继续前进时,算法停止。

该算法存在问题:1.不能保证求得的最后解是最佳的;2. 不能用来求最大或最小解问题;3. 只能求满足某些约束条件的可行解的范围。

(1)函数头文件定义和宏定义#include<stdio.h>#define N 8 //便于改变棋盘大小(2)程序要用到的一些全局变量的定义int xx[8]={1,2,2,1,-1,-2,-2,-1};int yy[8]={2,1,-1,-2,-2,-1,1,2}; //控制马能走的8个方向int Board[N][N]={0}; //初始棋盘所有位置可走(3)定义FeassiblePath //计算每个点的后续着点个数int FeassiblePath(int x,int y,int start){//函数体(详见“详细设计”)}(4)定义NextPath/*找出一个着点的后续着点中可走方位最少的,把着点到后续点的方向记下返回主函数*/int NextPath(int x,int y,int start){//函数体(详见“详细设计”)}(5)定义主函数void main(){//输入初始位置x0,y0//定义变量整型变量start控制起始8种方向While(start<8){//循环调用NextPath(x0,y0,start)//找到方案,则输出之start++;}}三详细设计1.回溯法“马踏棋盘”演示程序#include<stdio.h>#include<stdlib.h>#define N 8typedef struct{int b[N*N]; //记录每次走的方向int top;}SqStack;bool HorsePath(int Board[][N],int x,int y){SqStack *s;s=(SqStack*)malloc(sizeof(SqStack)); //初始化栈s->top=-1;int xx[8]={1,2,2,1,-1,-2,-2,-1};int yy[8]={2,1,-1,-2,-2,-1,1,2}; //控制马能走的8个方向int p=0;s->top++;s->b[s->top]=p;while(s->top>-1){Board[x][y]=s->top+1;//找到方案,则输出之if(Board[x][y]==N*N)return true;while(p<8){ //如果下一格可走且不超出棋盘范围if(Board[x+xx[p]][y+yy[p]]==0&&((x+xx[p])>=0&&(x+xx[p])<N) &&((y+yy[p])>=0&&(y+yy[p])<N)){x+=xx[p];y+=yy[p];s->top++;s->b[s->top]=p;p=0;break;}p++;}if(p==8){Board[x][y]=0;x-=xx[s->b[s->top]];y-=yy[s->b[s->top]];p=s->b[s->top]+1;s->top--;}}return false; //循环结束,未找到合适方案}void main(){bool flag;int x0,y0,i,j;int Board[N][N]={0}; //设置开始每一格都可走printf("请输入马的起始位置x,y\n注:(0=<x<%d,0=<y<%d):",N,N);while(scanf("%d,%d",&x0,&y0)){if(x0<0||x0>=N||y0<0||y0>=N)printf("位置输入有误,请重新输入:");elsebreak;}flag=HorsePath(Board,x0,y0);if(flag==false){printf("无法遍历!\n");}else{printf("一种可行的方案为:\n");for(i=0;i<N;i++){for(j=0;j<N;j++)printf("\t%d",Board[i][j]);printf("\n\n");}z}}2.贪心法“马踏棋盘”演示程序#include<stdio.h>#define N 8int xx[8]={1,2,2,1,-1,-2,-2,-1};int yy[8]={2,1,-1,-2,-2,-1,1,2}; //控制马能走的8个方向int Board[N][N]={0}; //初始棋盘所有位置可走//计算每个点的后续着点个数int FeassiblePath(int x,int y,int start){int count=0,i=0,p,k;k=start;while(i<8){//若下一着点可走且没有超出边界if(Board[x+xx[k%8]][y+yy[k%8]]==0&&(x+xx[k%8]>=0&&x+xx[k%8]<N) &&(y+yy[k%8]>=0&&y+yy[k%8]<N)){count++;}k++;i++;}return count;}//找出一个着点的后续着点中可走方位最少的,把着点到后续着点的方向记下返回主函数int NextPath(int x,int y,int start){int min=9,i=0,num,p,k,f;k=start;while(i<8){//若下一着点可走且没有超出边界if(Board[x+xx[k%8]][y+yy[k%8]]==0&&(x+xx[k%8]>=0&&x+xx[k%8]<N) &&(y+yy[k%8]>=0&&y+yy[k%8]<N)){num=FeassiblePath(x+xx[k%8],y+yy[k%8],start);if(min>num){min=num;f=k%8;}}k++;i++;}if(min==9)return -1;return f; //后续着点的方向记下返回主函数}void main(){int i,j,x0,y0,start=0,flag,sign=0;printf("请输入马的起始位置x,y\n注:(0=<x<%d,0=<y<%d):",N,N); while(scanf("%d,%d",&x0,&y0)){if(x0<0||x0>=N||y0<0||y0>=N)printf("位置输入有误,请重新输入:");elsebreak;}Board[x0][y0]=1;while(start<8){ //如果一种起始方位无法遍历,改变方位,再次寻找i=x0;j=y0;for(int step=2;step<=N*N;step++){flag=NextPath(i,j,start);if(flag!=-1){i+=xx[flag];j+=yy[flag];Board[i][j]=step;}elsebreak;} //若找到一种方案,则输出之if(step==N*N+1){sign=1;printf("一种可行的方案为:\n");for(i=0;i<N;i++){printf("\t");for(j=0;j<N;j++)printf("%d\t",Board[i][j]);printf("\n\n");}}if(sign==1)break;start++;}if(sign==0){printf("此起始点下无法遍历,或许方案根本不存在!\n试改变起始点寻找方案!\n");}}四最终输出1.回溯法(1)程序正确输入下运行结果(2)回溯法求解的时间复杂度分析设问题的规模为n,即棋盘的的大小为n*n。

相关文档
最新文档