马踏棋盘数据结构实践报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

马踏棋盘问题

摘要:

马踏棋盘就是在国际象棋8X8棋盘上面,按照国际象棋规则中马的行进规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。理解栈的“后进先出”的特性以及学会使用回溯。

关键字:马踏棋盘、递归、栈、回溯

1.引言

马踏棋盘就是在国际象棋8X8棋盘上面,按照国际象棋规则中马的行进规则,实现从任意初始位置,每个方格只进入一次,走遍棋盘上全部64个方格。

编制程序,求出马的行走路线,并按求出的行走路线,将数字1,2….64依次填入一个8X8的方阵,并输出它的行走路线。输入:任意一个起始位置;输出:无重复踏遍棋盘的结果,以数字1-64表示行走路线。

2.需求分析

(1)需要输出一个8X8的棋盘,可以采用二维数组的方法实现。

(2)输入马的起始位置,必须保证输入的数字在规定范围内,即0<=X<=7,0<=Y<=7。

(3)保证马能走遍整个棋盘,并且不重复。

(4)在棋盘上输出马的行走路线,标记好数字1、2、3直到64。

3.数据结构设计

采用栈数组为存储结构。

#define maxsize 100

struct

{

int i;

int j;

int director;

}stack[maxsize];

4.算法设计

4.1 马的起始坐标

void location(int x,int y) //马的位置坐标的初始化

{

top++;

stack[top].i=x; //起始位置的横坐标进栈

stack[top].j=y; //起始位置的竖坐标进栈

stack[top].director=-1;

a[x][y]=top+1; //标记棋盘Try(x,y); //探寻的马的行走路线

}

4.2 路径探寻函数

void Try(int i,int j)

{ int count,find,min,director;

int i1,j1,h,k,s;

int

b[8]={-2,-2,-1,1,2,2,1,-1},c[8]={1,-1,-2,-2,-1,1,2,2} ;

//存储马各个出口相对当前位置行、列坐标的增量数组

int b2[8],b1[8];

for(h=0;h<=7;h++)

//用数组b1[8]记录当前位置的下一个位置的可行路径的条数

{ count=0;

i=stack[top].i+c[h];

j=stack[top].j+b[h];

if(i>=0&&i<=7&&j>=0&&j<=7&&a[i][j]==0) //如果找到下一个位置

{

for(k=0;k<=7;k++)

{

i1=i+c[k];

j1=j+b[k];

if(i1>=0&&i1<=7&&j1>=0&&j1<=7&&a[i1]

[j1]==0) //如果找到下一个位置

count++; //记录条数}

b1[h]=count; //将条数存入b1[8]中

}

}

for(h=0;h<=7;h++)

//根据可行路径条数的大小,从小到大排序,并放入数组b2[8]中

{min=9;

for(k=0;k<=7;k++)

if(min>b1[k])

{

min=b1[k];

b2[h]=k;

s=k;

}

b1[s]=9;

}

find=0;

director=stack[top].director;

for(h=director+1;h<=7;h++)//向8个方向进行寻找

{

i=stack[top].i+c[b2[h]];

j=stack[top].j+b[b2[h]];

if(i>=0&&i<=7&&j>=0&&j<=7&&a[i][j]= =0)

{stack[top].director=h; //存储栈的寻找方向

top++; //进栈

stack[top].i=i;

stack[top].j=j;

stack[top].director=-1;//重新初始化下一栈的方向

a[i][j]=top+1;

find=1; //找到下一位置

break;

}

}

if(find!=1)

{a[stack[top].i][stack[top].j]=0; //清除棋盘的标记

top--; //退栈

}

if(top<63)

Try(i,j); //递归

}

4.3输出函数

void display()

{

int i,j;

for(i=0;i<=7;i++)

{ for(j=0;j<=7;j++)

printf("\t%d ",a[i][j]); //输出马的行走路线

printf("\n\n");

}

printf("\n");

}

5.程序实现

5.1 主函数

void main()

{

int i,j,x,y;

for(i=0;i<=7;i++) //棋盘的初始化

for(j=0;j<=7;j++)

a[i][j]=0;

printf("输入X Y (0=

if(x>=0&&x<=7&&y>=0&&y<=7)

//判断输入的起始位子是否正确

{

location(x,y);

display();

}

else printf("错误\n");

}

相关文档
最新文档