数据结构课程设计马踏棋盘Word文档下载推荐.docx
《数据结构课程设计马踏棋盘Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计马踏棋盘Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。
一、需求分析
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
二、概要设计
为实现上述程序功能,应用栈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;
If(起始位置在棋盘之内)
Break;
}
调用栈函数InitLocation(x-1,y-1);
2)判断是否踏遍棋盘函数
boolFind(inti,intj)
while(栈不空)
{
if(踏遍了棋盘)
{
returntrue;
}
for(k=0;
k<
8;
k++)
依次求8个方向;
if(该位置存在且没走)
{
寻找各方向的可走路径数;
a[k]存放各路径数;
}
把各路径数按从小到大顺序排列
if(有路可走)
find=1;
break;
}
if(下一步有路可走)
向下走一步;
else//下一个位置无路
清除棋盘上一步的标记;
倒退一步;
}
returnfalse;
3)输出函数
voidPrint()
for(i=0;
i<
N;
i++)
for(j=0;
j<
j++)
printf("
%4d"
board[i][j]);
printf("
\n"
);
4)初始化栈函数
voidInitLocation(inti,intj)
初始化栈;
If(找到了踏遍棋盘的路)
调用输出函数Print();
三、详细设计
#include<
stdio.h>
#defineMax20
intN;
intboard[Max][Max];
//标记棋盘
inttop=0;
//标记栈指针
structStack
}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)//踏遍了棋盘
number=0;
i=stack[top].i+hi[k];
j=stack[top].j+hj[k];
if(board[i][j]==0&
&
i>
=0&
N&
j>
N)
for(m=0;
m<
m++)//寻找各方向的路径数
{
xi=i+hi[m];
yj=j+hj[m];
if(board[xi][yj]==0&
xi>
xi<
yj>
yj<
number++;
}
a[k]=number;
k++)//把各路径数按从小到大顺序排列
min=9;
for(m=0;
m++)
if(a[m]<
min)
min=a[m];
b[k]=m;
a[b[k]]=9;
find=0;
i=stack[top].i+hi[b[k]];
j=stack[top].j+hj[b[k]];
if(find)//下一步有路可走
top++;
stack[top].i=i;
stack[top].j=j;
board[i][j]=top+1;
board[stack[top].i][stack[top].j]=0;
//清除棋盘的标记
top--;
//倒退一步
voidPrint()//输出棋盘
inti,j;
printf("
voidInitLocation(inti,intj)//初始化栈并判断输出
stack[top].i=i;
stack[top].j=j;
board[i][j]=top+1;
if(Find(i,j))
Print();
intmain()
intx,y;
InputN(N*N棋盘):
"
scanf("
%d"
&
N);
i++)//初始化棋盘
board[i][j]=0;
while
(1)
Inputx(1<
x<
=N):
scanf("
x);
Inputy(1<
y<
y);
if(x>
=1&
=N&
y>
=N)
break;
Yourinputiswrong!
!
beginwith%drow,%drolonboard:
\n\n"
x,y);
InitLocation(x-1,y-1);
return0;
四、调试分析
1.本次作业比较简单,只有一个核心算法,即求下一步该怎么走,以及是否有路可走,所以总的调试比较顺利。
在调试Find算法时,遇到两个问题:
一是没有考虑到马的这一步失败后的回溯,另一个是避免重复以前走过的路。
2.本程序模块简洁,在main()函数里得到充分体现;
3.用户可灵活控制棋盘的规模大小以及马踏的起始位置,本程序具有一定的通用性。
五、用户手册
1.本程序运行环境为Windows操作系统,执行文件为:
mata.exe
2.进入演示程序后显示的界面:
六、测试结果