马踏棋盘数据结构实践报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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"); }