马踏棋盘课程设计实验报告.docx
《马踏棋盘课程设计实验报告.docx》由会员分享,可在线阅读,更多相关《马踏棋盘课程设计实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
马踏棋盘课程设计实验报告
《数据结构》
课
程
设
计
实
验
报
课程名称:
《数据结构》课程设计
课程设计题目:
马踏棋盘
姓名:
邱可昉
院系:
计算机学院
专业:
计算机科学与技术
班级:
10052313
学号:
10051319
指导老师:
王立波
2012年5月18日
1.课程设计的目的3
2•问题分析3
3.课程设计报告内容3
(1)概要设计3
(2)详细设计3
(3)测试结果5
(4)程序清单6
4.个人小结10
1.课程设计的目的
《数据结构》是计算机软件的一门基础课程,计算机科学各领域及有关的应用软件都要用到各种类型的数据结构。
学好数据结构对掌握实际编程能力是很有帮助的。
为了学好《数据结构》,必须编写一些在特定数据结构上的算法,通过上机调试,才能更好地掌握各种数据结构及其特点,同时提高解决计算机应用实际问题的能力。
2.问题分析
*问题描述:
将马随机放在国际象棋的8X8棋盘Bo阿rd[0..7,0..7]的某个方格中,马按走
棋规则进行移动。
要求每个方格上只进入一次,走遍棋盘上全部64个方格。
编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,…,64依次填入8X8的方阵
输出之。
*测试数据:
由读者指定,可自行指定一个马的初始位置。
*实现提示:
每次在多个可走位置中选择一个进行试探,其余未曾试探过的可走位置必须用适当结构妥善管理,以备试探失败时的“回溯”(悔棋)使用。
并探讨每次选择位置的“最佳策略”,以减少回溯的次数。
3.课程设计报告内容
(1)概要设计
定义一张棋盘,定义一个栈保存马走的路径的点坐标和来自方向,用函数计算周围可走坐标,并检查正确性,当周围没有可走格子时退栈到最优位置,继续进行,然后将路径输出。
(2)详细设计
定义结构体,方向数组和Qioan类
structPoint
{
intx;//记录横坐标
inty;//记录纵坐标
intfrom;//前一个位置的方向
};
Pointside[8]={0,0,0};//记录可能的方向坐标
}
Qipan:
:
~Qipan(){//销毁棋盘
}
voidQipan:
:
Setside(Pointcur){//根据输入的当前点设置下一个点的可能方
向坐标
个点
I八、、
x和y:
"<11"<while(begin.x>8||begin.x<1||begin.y>8||begin.y<1){cout<<"输入有误,请重新输入cout<<"其中1<=x,y<=8,如:
cout<<"输入:
";cin>>begin.x>>begin.y;
//定义Qipan类的对象A//A运行函数HorseVisit
}begin.x--;begin.y--;begin.from=0;QipanA;s=A.HorseVisit(begin);
}return0;
(3)测试结果
对于一次死路后退栈次数进行测试
1次用时很长且为运行出来
115&7亍扯舟
马踏棋盘的路线为*11833
1427102G31372212
2次
5060432691?
21734495942占354158&24629
61&313754644732155112B45G2563?
243@36
5363钿38214148234055615157
您是否需更继续运行该程序3—继续土叶-退岀):
请麵人马的初始位置*和y;
具电-8,i0T11
4^-\
wA:
ii
10253916
马渚棋盘的路线为百11S3350仙43269192122?
442717344959S3&34&36
422S354158526256392^171332S10^314923403045281151S3222
37476454483116£2L3»砧615157
您是否需曼继续运行该程序(V—继统小一退出):
.
又测试了其他几个点得出一次死路退栈5次能尽量少的减少退栈次数
其他几个点的数据
请嶽入马的初始俚置x和y;
县中l<=x^y<=8,如;11
输入r22
187270
马踏楫盘的路线均:
1H2S42S7S13417111182R4S3F41SHS24(;29122193
G2693293?
2?
3350G9434?
5?
5363483121414823616225153238
4461EE403Q137243954G44?
£25G
會是否需要継续运行该程序(旷理续"一退岀八
44615S4030137243954644?
G2隅否需要纟險运彳二该程序@纟除“退出)闿胡审入马的初贻隹置*和卯!
其中丄<=心H-6,如:
11輸人言3
113970
馬建棋盘的丄密先为:
19217344959533B26S3181112843335060453525
425?
石14159526256392?
1222325203?
2?
10142d7133047&45
4461466348311&621395540239
恣是否需要£蟻运行该程序(旷權续“一退岀):
(4)程序清单
#include
#inelude"SqStack.h"
usingnamespacestd;
#defineMAXSIZE70
#defineN8
structPoint
{
intx;//记录横坐标
inty;//记录纵坐标
intfrom;//前一个位置的方向};
Pointside[8]={0,0,0};//
记录可能的方向坐标
classQipan{
public:
Qipan();
~Qipan();
voidSetside(Point);boolGetside(int,Point&);boolHorseVisit(Point);boolPass(Point);
private:
int**gezi;
};
Qipan:
:
Qipan(){
inti,j;
gezi=newint*[N];for(i=0;i}
for(i=0;ifor(j=0;j}
Qipan:
:
~Qipan(){
for(inti=0;i}if(gezi==NULL)delete[]gezi;
}
voidQipan:
:
Setside(Pointcur){//
//设置方向坐标
//将指定方向的坐标给特定指针
//输入开始点运行棋盘
//输出路径
//棋盘格子
//构造函数构建棋盘
//销毁棋盘
根据输入的当前点设置下一个点的可能方向坐标
Pointround[]={{cur.x-2,cur.y-1,0},{cur.x-1,cur.y-2,0},
{cur.x+1,cur.y-2,0},{cur.x+2,cur.y-1,0},{cur.x+2,cur.y+1,0},
{cur.x+1,cur.y+2,0},{cur.x-1,cur.y+2,0},{cur.x-2,cur.y+1,0},};
for(inti=0;i<8;i++){
side[i].x=round[i].x;
side[i].y=round[i].y;
next.from=0;horseVisit.Push(next);
break;
}
if(!
flag){的格子,则退栈5次intj=0;
while(j<5&&horseVisit.Length()>1){化,退栈次数比较少
if(yn=='y'||yn=='Y')s=true;
elses=false;
returns;
}
intmain(){
bools=true;
while(s){
intcount=0;
intgezi[8][8]={0};
Pointbegin;
cout<<"请输入马的初始位置x和y:
";cout<cout<<"其中1<=x,y<=8,如:
11"<";
cin>>begin.x>>begin.y;//输入起始点,并判断正确性while(begin.x>8||begin.x<1||begin.y>8||begin.y<1){
cout<<"输入有误,请重新输入x和y:
"<cout<<"其中1<=x,y<=8,如:
11"<cout<<"输入:
";
cin>>begin.x>>begin.y;
}
begin.x--;
begin.y--;
begin.from=0;
QipanA;//定义Qipan类的对象A
s=A.HorseVisit(begin);//A运行函数HorseVisit
}
return0;
}
4.个人小结
这是第二次写数据结构课程设计的代码,相对于第一次的生疏,这次已经能比较熟练地知晓题目应该如何编写的框架了,但具体实现的想法还是在网络中寻找了思路,然后写出了代码,一开始调试时一直出错,结果是自己在一个while循环的判断条件处多加了一个“!
”,这导致了我一直无法运行起程序,后来在自习检查代码后发现了这一点,由此看出,数据结构编写程序不仅要对学习的只是能够灵活运用在编写代码的时候还要仔细仔细再仔细。
我要在以后的学习中注意以下几点:
1.认真上好专业课,多在实践中锻炼自己。
2.写程序要考虑周到,严密。
3.在做设计的时候要有信心,有耐心,不浮躁。
4.认真学习课本知识,掌握课本中的知识点,并在此基础上学会灵活运用。
5.在课余时间多写程序,熟练掌握在调试程序过程中常见的错误,一边节约调试程序的时间。