数据结构课程设计马踏棋盘Word文档下载推荐.docx

上传人:b****4 文档编号:18406658 上传时间:2022-12-16 格式:DOCX 页数:12 大小:108.65KB
下载 相关 举报
数据结构课程设计马踏棋盘Word文档下载推荐.docx_第1页
第1页 / 共12页
数据结构课程设计马踏棋盘Word文档下载推荐.docx_第2页
第2页 / 共12页
数据结构课程设计马踏棋盘Word文档下载推荐.docx_第3页
第3页 / 共12页
数据结构课程设计马踏棋盘Word文档下载推荐.docx_第4页
第4页 / 共12页
数据结构课程设计马踏棋盘Word文档下载推荐.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构课程设计马踏棋盘Word文档下载推荐.docx

《数据结构课程设计马踏棋盘Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计马踏棋盘Word文档下载推荐.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构课程设计马踏棋盘Word文档下载推荐.docx

一、需求分析

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.进入演示程序后显示的界面:

六、测试结果

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1