数据结构课程设计马踏棋盘.docx
- 文档编号:5419147
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:12
- 大小:108.65KB
数据结构课程设计马踏棋盘.docx
《数据结构课程设计马踏棋盘.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计马踏棋盘.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构课程设计马踏棋盘
中南民族大学
数据结构课程设计报告
姓名:
康宇
年级:
2010
学号:
10061014
专业:
计算机科学与技术
指导老师:
宋中山
2013年4月15日
实习报告:
2.4题马踏棋盘
题目:
设计一个国际象棋的马踏棋盘的演示程序
班级:
计科一班姓名:
康宇学号:
10061014完成日期:
2013.4.15
一、需求分析
1、国际象棋的马踏棋盘的功能是:
将马随机放在国际象棋的N*N棋盘board[N][N]的某个方格中,马按走棋规则进行移动。
要求每个方格只进一次,走遍棋盘上全部N*N个方格。
编制非递归程序,求出马的行走路线,并按求出的行走路线,将数字1,2,...,N*N依次填入一个N*N的方阵,输出之。
2、测试数据:
N由读者指定。
马开始的位置也有读者指定(x,y),1<=x<=N,1<=y<=N.
3、实现提示:
下图显示了N为6,马位于方格(3,3),8个可能的移动位置。
一般来说,马位于位置(x,y)时,可以走到下列8个位置之一。
但是,如果(x,y)靠近棋盘的边缘,上述有些位置可能超出棋盘范围,成为不允许的位置。
8个可能的位置可以用两个一维数组hi[0...7],hj[0...7]来表示:
123456
8
1
7
2
H
6
3
5
4
1
2
3
4
5
6
二、概要设计
为实现上述程序功能,应用栈Stack[Max*Max]来表示棋盘的行和列。
定义棋盘的规格N,马在下一步可以走的8个位置,hi[0...7],hj[0...7],用数组board[Max][Max]来标记棋盘,top标记栈指针。
用户在输入了期盼的规格和起始坐标后,程序通过八个方向的探寻,输出第一个符合要求的棋盘,棋盘上显示了马每一步的位置,每一个位置只踏了一次,且踏遍棋盘。
1、元素类型(栈):
structStack
{
inti;//行坐标
intj;//列坐标
}stack[Max][Max];
2、建立三个全局位置数组:
inthi[8]={-2,-1,1,2,2,1,-1,-2};
inthj[8]={1,2,2,1,-1,-2,-2,-1};
用来存放下一个可能位置的横纵坐标;
intboard[Max][Max];
用来标记棋盘。
3、本程序包括4个模块
1)主程序:
Voidmain()
{
While
(1)
{
Input棋盘规格N;
Input起始位置的x;
Input起始位置的x;
If(起始位置在棋盘之内)
Break;
}
调用栈函数InitLocation(x-1,y-1);
}
2)判断是否踏遍棋盘函数
boolFind(inti,intj)
{
while(栈不空)
{
if(踏遍了棋盘)
{
returntrue;
}
for(k=0;k<8;k++)
{
依次求8个方向;
if(该位置存在且没走)
{
寻找各方向的可走路径数;
a[k]存放各路径数;
}
}
把各路径数按从小到大顺序排列
for(k=0;k<8;k++)
{
if(有路可走)
{
find=1;
break;
}
}
if(下一步有路可走)
{
向下走一步;
}
else//下一个位置无路
{
清除棋盘上一步的标记;
倒退一步;
}
}
returnfalse;
}
3)输出函数
voidPrint()
{
for(i=0;i { for(j=0;j { printf("%4d",board[i][j]); } printf("\n"); } } 4)初始化栈函数 voidInitLocation(inti,intj) { 初始化栈; If(找到了踏遍棋盘的路) 调用输出函数Print(); } 三、详细设计 #include #defineMax20 inthi[8]={-2,-1,1,2,2,1,-1,-2}; inthj[8]={1,2,2,1,-1,-2,-2,-1}; intN; intboard[Max][Max];//标记棋盘 inttop=0;//标记栈指针 structStack { inti; intj; }stack[Max*Max]; boolFind(inti,intj)//是否能踏遍棋盘 { //find标记是否找到下一个位置,number标记8个位置的路径数,min标记最少的路径 intfind,number,min; intxi,yj,k,m; inta[8],b[8];//a[]标记各位置的路径数,b[]标记由小到大的路径数对应的下标 while(top>-1) { if(top==N*N-1)//踏遍了棋盘 { returntrue; } for(k=0;k<8;k++) { number=0; i=stack[top].i+hi[k]; j=stack[top].j+hj[k]; if(board[i][j]==0&&i>=0&&i { for(m=0;m<8;m++)//寻找各方向的路径数 { xi=i+hi[m]; yj=j+hj[m]; if(board[xi][yj]==0&&xi>=0&&xi number++; } a[k]=number; } } for(k=0;k<8;k++)//把各路径数按从小到大顺序排列 { min=9; for(m=0;m<8;m++) { if(a[m] { min=a[m]; b[k]=m; } } a[b[k]]=9; } find=0; for(k=0;k<8;k++) { i=stack[top].i+hi[b[k]]; j=stack[top].j+hj[b[k]]; if(board[i][j]==0&&i>=0&&i { find=1; break; } } if(find)//下一步有路可走 { top++; stack[top].i=i; stack[top].j=j; board[i][j]=top+1; } else//下一个位置无路 { board[stack[top].i][stack[top].j]=0;//清除棋盘的标记 top--;//倒退一步 } } returnfalse; } voidPrint()//输出棋盘 { inti,j; for(i=0;i { for(j=0;j { printf("%4d",board[i][j]); } printf("\n"); } printf("\n"); } voidInitLocation(inti,intj)//初始化栈并判断输出 { stack[top].i=i; stack[top].j=j; board[i][j]=top+1; if(Find(i,j)) Print(); } intmain() { intx,y; inti,j; printf("InputN(N*N棋盘): "); scanf("%d",&N); for(i=0;i for(j=0;j board[i][j]=0; while (1) { printf("Inputx(1 "); scanf("%d",&x); printf("Inputy(1 "); scanf("%d",&y); if(x>=1&&x<=N&&y>=1&&y<=N) break; printf("Yourinputiswrong! ! ! \n"); } printf("beginwith%drow,%drolonboard: \n\n",x,y); InitLocation(x-1,y-1); return0; } 四、调试分析 1.本次作业比较简单,只有一个核心算法,即求下一步该怎么走,以及是否有路可走,所以总的调试比较顺利。 在调试Find算法时,遇到两个问题: 一是没有考虑到马的这一步失败后的回溯,另一个是避免重复以前走过的路。 2.本程序模块简洁,在main()函数里得到充分体现; 3.用户可灵活控制棋盘的规模大小以及马踏的起始位置,本程序具有一定的通用性。 五、用户手册 1.本程序运行环境为Windows操作系统,执行文件为: mata.exe 2.进入演示程序后显示的界面: 六、测试结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 棋盘