实验报告 马踏棋盘Word文件下载.docx
《实验报告 马踏棋盘Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验报告 马踏棋盘Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
int
x;
int
y;
from;
}Point;
(2)、栈的存储方式
#define
STACKSIZE
70
STACKINCREASE
10
Stack
Point
*top;
*base;
stacksize;
};
(1)、设定栈的抽象数据类型定义:
ADT
数据对象:
D={ai
|
ai∈ElemSet,i=1,2,„,n,n≥0}
数据关系:
R1={<
ai-1
ai>
|ai-1,
ai∈D,i=2,„,n}
约定an端为栈顶,ai端为栈顶。
基本操作:
InitStack(&
s)
操作结果:
构造一个空栈s,
DestroyStack(&
初始条件:
栈s已存在。
操作结果:
栈s被销毁。
ClearStack(&
栈s清为空栈。
StackEmpty(&
若栈s为空栈,则返回TRUE,否则返回FALSE。
StackLength(s);
初始条件:
栈s存在。
返回s的元素个数,即栈的长度。
GetTop
(s,&
e);
栈s已存在且非空。
用e返回s的栈顶元素。
Push(&
s,e)
插入元素e为新的栈顶元素。
Pop(&
s,&
e)
栈s存在且非空。
删除栈顶元素,并用e返回。
stackTraverse(s,visit())
从栈底到栈顶依次对s的每个元素调用visit()。
一旦visit()失败,则操作失败。
}ADT
Stack
本程序包含模块:
1、主程序模块:
void
main(){定义变量;
接受命令;
处理命令;
退出;
}
2、起始坐标函数模块——马儿在棋盘上的起始位置;
3、探寻路径函数模块——马儿每个方向进行尝试,直到试完整个棋盘;
4、输出路径函数模块——输出马儿行走的路径;
3.详细设计
1.函数声明
VoidInitLocation(intxi,int
yi);
//马儿在棋盘上的起始位置标
TryPath(int
i,int
j);
//马儿每个方向进行尝试,直到试完整个棋盘
Display();
//输出马儿行走的路径
2.
起始坐标函数模块
InitLocation(int
xi,int
yi)
x,y;
//定义棋盘的横纵坐标变量
top++;
//栈指针指向第一个栈首
stack[top].i=xi;
//将起始位置的横坐标进栈
stack[top].j=yi;
//将起始位置的纵坐标进栈
stack[top].director=-1;
//将起始位置的尝试方向赋初值
board[xi][yi]=top+1;
//标记棋盘
x=stack[top].i;
//将起始位置的横坐标赋给棋盘的横标
y=stack[top].j;
//将起始位置的纵坐标赋给棋盘的纵坐标
if(TryPath(x,y))
//调用马儿探寻函数,如果马儿探寻整个棋盘返回1否则0
//输出马儿的行走路径
else
printf("
无解"
);
}
3.
探寻路径函数模块
j)
find,director,number,min;
//定义几个临时变量
i1,j1,h,k,s;
a[8],b1[8],b2[8],d[8];
//定义几个临时数组
while(top>
-1)
//栈不空时循环
for(h=0;
h<
8;
h++)
//用数组a[8]记录当前位置的下一个位置的可行路径的条数
{
number=0;
i=stack[top].i+Htry1[h];
j=stack[top].j+Htry2[h];
b1[h]=i;
b2[h]=j;
if(board[i][j]==0&
&
i>
=0&
i<
8&
j>
j<
8)
//如果找到下一位置
for(k=0;
k<
k++)
i1=b1[h]+Htry1[k];
j1=b2[h]+Htry2[k];
if(board[i1][j1]==0&
i1>
i1<
j1>
j1<
//如果找到下一位置
number++;
//记录条数
a[h]=number;
//将条数存入数组a[8]中
}
//根据可行路径条数小到大按下表排序放d[8]中
min=9;
if(min>
a[k])
min=a[k];
d[h]=k;
//将下表存入数组d[8]中
s=k;
a[s]=9;
director=stack[top].director;
if(top>
=63)
//如果走完整个棋盘返回1
return
(1);
find=0;
//表示没有找到下一个位置
for(h=director+1;
//向八个方向进行探寻
i=stack[top].i+Htry1[d[h]];
j=stack[top].j+Htry2[d[h]];
if(board[i][j]==0&
find=1;
//表示找到下一个位置
Break;
if(find==1)
//如果找到下一个位置进栈
stack[top].director=director;
//存储栈结点的方向
top++;
//栈指针前移进栈
stack[top].i=i;
stack[top].j=j;
//重新初始化下一栈结点的尝试方向
board[i][j]=top+1;
else
//否则退栈
board[stack[top].i][stack[top].j]=0;
//清除棋盘的标记
top--;
//栈指针前移退栈
(0);
4.
输出路径函数模块
Display()
i,j;
for(i=0;
N;
i++)
for(j=0;
j++)
\t%d
"
board[i][j]);
//输出马儿在棋盘上走过的路径
printf("
\n\n"
printf("
\n"
四、测试数据及测试结果
测试数据:
x=2,y=3
测试结果如下:
5.原程序代码
#include<
stdio.h>
MAXSIZE
100
N
8
board[8][8];
//定义棋盘
Htry1[8]={1,-1,-2,2,2,1,-1,-2};
/*存储马各个出口位置相对当前位置行下标的*/
Htry2[8]={2,-2,1,1,-1,-2,2,-1};
/*存储马各个出口位置相对当前位置列下标的增量数组*/
Stack{
//定义栈类型
i;
//行坐标
j;
//列坐标
director;
//存储方向
}stack[MAXSIZE];
//定义一个栈数组
top=-1;
//栈指针
//马儿在棋盘上的起始位置坐标
//输出马儿行走的路径
yi)
//定义棋盘的横纵坐标变量
//将起始位置的横坐标赋给棋盘的横坐标
//调用马儿探寻函数,如果马儿探寻整个棋盘返回1否则返回0
//定义几个临时变量
//栈不空时循环
for(h=0;
number=0;
b1[h]=i;
b2[h]=j;
for(k=0;
k++)
i1=b1[h]+Htry1[k];
//如果找到下一位置
//根据可行路径条数小到大按下表排序放
入数组d[8]中
min=9;
If(min>
d[h]=k;
a[s]=9;
j=stack[top].j+Htry2[d[h]];
break;
stack[top].i=i;
stack[top].j=j;
board[stack[top].i][stack[top].j]=0;
return
Display()
main()
//初始化棋盘
for(j=0;
board[i][j]=0;
for(;
;
)
Please
input
importpoint(1<
=x<
=8
and
1<
=y<
=8)\n"
Input
x
=
scanf("
%d"
&
x);
//输入起始位置的横坐标
y
scanf("
y);
//输入起始位置的纵坐标
if(x>
=1&
x<
=8&
y>
y<
=8)break;
Your
is
worng!
!
begin
with
%d
board:
8*(x-1)+y);
InitLocation(x-1,y-1);
//调用起始坐标函数