马踏棋盘Word文件下载.docx
- 文档编号:21315008
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:9
- 大小:56.73KB
马踏棋盘Word文件下载.docx
《马踏棋盘Word文件下载.docx》由会员分享,可在线阅读,更多相关《马踏棋盘Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
3课程设计报告内容……………………………………………………………x
1、概要设计……………………………………………………………………x
2、测试结果……………………………………………………………………x
4小结…………………………………………………………………………x
5程序清单………………………………………………………………………x
6参考文献………………………………………………………………x
1、课程设计的目的
(1)熟练使用C++语言编写程序,解决实际问题;
(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
(5)掌握栈的应用
2、需求分析
v基本的任务
关于马踏棋盘的基本过程:
国际象棋的棋盘为8*8的方格棋盘。
现将"
马"
放在任意指定的方格中,按照"
走棋的规则将"
进行移动。
要求每个方格只能进入一次,最终使得"
走遍棋盘的64个方格。
v基本的解决的思路
马踏棋盘是经典的程序设计问题之一,主要的解决方案有两种:
一种是基于深度优先搜索的方法,另一种是基于贪婪算法的方法。
第一种基于深度优先搜索的方法是比较常用的算法,深度优先搜索算法也是数据结构中的经典算法之一,主要是采用递归的思想,一级一级的寻找,最后找到合适的解。
而基于贪婪的算法则是依据贪婪算法的思想设置一种标准,然后依据标准进行选择,从而得到解,但是他不一定能够得到最优解。
3、课程设计报告内容
1.概要设计
v定义行走的向八个方向
staticconstintx_move[]={-2,-1,1,2,2,1,-1,-2};
staticconstinty_move[]={1,2,2,1,-1,-2,-2,-1};
v定义了点的结构
structPoint
{
intx,y;
intdirection;
};
v位置是否可以通行
boolMaTa:
:
Valid(Pointx)
v剪枝——对于下一个结点的下一个结点的可走路径排序
voidMaTa:
Sort(PointX)
v能否走过棋盘的实现
exitMata(Pointstart)
v打印棋盘
Print()
测试结果:
4、小结
一、这次课程设计的心得体会通过实践我的收获如下:
1、巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。
2、培养了我选用参考书,查阅手册及文献资料的能力。
培养独立思考,深入研究,分析问题、解决问题的能力。
3、通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。
二、验收以及开始程遇到的问题
1.我自己刚开始的时候基于,类似于迷宫的方法不断地递归的求解,跑的非常的满,没有达到贪心的策越,算法的效率很低。
2.对于本程序中的剪枝的策越,感谢老师的点拨,不然对于这样的思路,自己曾经也见过,剪枝的方法,但是发现这个过程特别的难,不同的题目的思路,策越都是不同的,有待于我自己增加见识,更快的发现解决的方法。
5、程序清单:
#include"
stdafx.h"
#include<
vector>
stack>
iostream>
#include<
algorithm>
time.h>
usingnamespacestd;
structPoint
boolcmp(constPointx,constPointy)
returnx.direction>
y.direction;
}
constintRows=8;
constintClowns=8;
classMaTa
public:
MaTa()
{
for(inti=0;
i<
Rows;
i++)
{
for(intj=0;
j<
Clowns;
j++)
{
Chess[i][j]=0;
}
}
}
boolValid(Pointx);
voidSort(PointX_Next);
voidexitMata(Pointstart);
voidPrint();
intChess[Rows][Clowns];
stack<
Point>
mata;
boolMaTa:
Valid(Pointx)
introw=x.x;
intclown=x.y;
if(row>
=0&
&
row<
Rows&
clown>
clown<
Clowns&
Chess[row][clown]==0)
returntrue;
returnfalse;
voidMaTa:
PointX_Next[8],X_Next_Next;
for(inti=0;
X_Next[i].x=X.x+x_move[i];
X_Next[i].y=X.y+y_move[i];
if(!
MaTa:
Valid(X_Next[i]))
X_Next[i].direction=-1;
continue;
X_Next[i].direction=0;
for(intj=0;
X_Next_Next.x=X_Next[i].x+x_move[j];
X_Next_Next.y=X_Next[i].y+y_move[j];
if(MaTa:
Valid(X_Next_Next))
X_Next[i].direction++;
/*for(inti=0;
8;
i++)
for(intj=i;
j++)
if(X_Next[i].direction<
X_Next[j].direction)
{
X_Next_Next=X_Next[i];
X_Next[i]=X_Next[j];
X_Next[j]=X_Next_Next;
}
}*/
sort(X_Next,X_Next+Clowns,cmp);
//从大到小排列
i++)//剪枝从最小的开始走;
mata.push(X_Next[i]);
intsteps=1;
Chess[start.x][start.y]=steps;
PointStackTop;
MaTa:
Sort(start);
while(!
mata.empty())
StackTop=mata.top();
//cout<
<
"
("
StackTop.x<
"
StackTop.y<
)"
endl;
if(StackTop.direction<
0)
mata.pop();
elseif(Chess[StackTop.x][StackTop.y]>
Chess[StackTop.x][StackTop.y]=0;
--steps;
else
Chess[StackTop.x][StackTop.y]=++steps;
MaTa:
Sort(StackTop);
if(Chess[StackTop.x][StackTop.y]==Clowns*Rows)
Print();
break;
if(mata.empty())
cout<
can‘trunallofchess"
;
cout<
"
恭喜!
成功穿过马踏棋盘"
<
endl;
for(inti=0;
i<
Rows;
++i)
for(intj=0;
j<
Clowns;
++j)
cout<
Chess[i][j];
cout<
endl<
int_tmain(intargc,_TCHAR*argv[])
clock_tstart,finish;
start=clock();
MaTaa;
Pointpoint;
Pleaseinputthefirststartposition"
suchasxy"
cin>
>
point.x>
point.y;
a.exitMata(point);
finish=clock();
printf("
本次计算一共耗时%f秒\n\n"
(double)(finish-start)/CLOCKS_PER_SEC);
return0;
6、参考文献
[1]严蔚敏吴伟民编著数据结构C语言版
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 棋盘