利用顺序栈或循环队列的存储来实现马踏棋盘的算法.docx
- 文档编号:29005214
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:9
- 大小:15.97KB
利用顺序栈或循环队列的存储来实现马踏棋盘的算法.docx
《利用顺序栈或循环队列的存储来实现马踏棋盘的算法.docx》由会员分享,可在线阅读,更多相关《利用顺序栈或循环队列的存储来实现马踏棋盘的算法.docx(9页珍藏版)》请在冰豆网上搜索。
利用顺序栈或循环队列的存储来实现马踏棋盘的算法
河南工业大学实验报告
课程数据结构
实验名称利用顺序栈或循环队列的存储来实现马踏棋盘的算法
学院信息科学与工程学院专业班级
姓名学号
实验报告日期2009年4月1日
教师审批签字
实验报告
一实验题目:
马踏棋盘
二实验要求:
将马放在国际象棋的8*8棋盘Board[8][8]的某个方格中,马按走棋的规则进行移动。
要求每个方格只能进入一次。
走遍棋盘上的全部的64个方格。
输入:
任意一个起始位置.
输出:
无重复踏遍棋盘的结果,以数字1-64表示行走路线.
数据结构要求:
采用顺序栈或者链栈实现
三实验目的:
1熟悉栈的定义和栈的基本操作
2熟悉每一种栈操作的一般函数实现和成员函数实现。
3在实际问题背景下灵活运用它们,并巩固这两种结构的构造方法
四程序设计如下:
#include"stdio.h"
#defineM70
#defineFALSE0
#defineTRUE1
typedefstructnode//结点的类型
{
intvec,x,y;
structnode*link;
}listnode;
#defineMAXSIZE70
typedefstruct
{
intstack[MAXSIZE];
inttop;
}seqstack;
seqstack*s;//顺序栈指针
listnodeag[M];
intflag[M];
voidsetnull(seqstack*s)
{
s->top=-1;
}
intpush(seqstack*s,intx)
{
if(s->top>=MAXSIZE-1)
{
printf("stackoverflow!
\n");
returnFALSE;
}
else
{
s->stack[++s->top]=x;/*栈顶指针上移,数据元素入栈*/
returnTRUE;
}
}
intpop(seqstack*s)/*出当前栈S的栈顶元素*/
{intp;
if(s->top<0)
{
printf("stackempty!
\n");/*栈空,返回空值*/
returnNULL;
}
else
{
s->top--;
return(s->stack[s->top+1]);
}
/*由于return语句的特点,必须先使top减1,
然后再执行return语句。
而此时栈顶元素的表示应该为s->top+1*/
}
voidcreatlist()
{
listnode*p;
inti,j,x,y,x1,x2,y1,y2,k;
k=1;
for(i=1;i<=8;i++)
{
for(j=1;j<=8;j++)
{
ag[k].x=i;
ag[k].y=j;
ag[k].vec=8*ag[k].x+ag[k].y-8;
ag[k].link=NULL;
printf("%d(%d,%d)",ag[k].vec,ag[k].x,ag[k].y);
k++;
}
printf("\n");
}
for(i=1;i<=64;i++)
{
/*printf("*%d*",i);*/
s=(seqstack*)malloc(sizeof(seqstack));
setnull(s);
x1=ag[i].x;
y1=ag[i].y;
if((x1+1>0)&&(y1+2>0)&&(x1+1<=8)&&(y1+2<=8))
{
x2=x1+1;
y2=y1+2;
j=8*x2+y2-8;
/*printf("%d",j);*/
push(s,j);
}
if((x1+1>0)&&(y1-2>0)&&(x1+1<=8)&&(y1-2<=8))
{
x2=x1+1;
y2=y1-2;
j=8*x2+y2-8;
/*printf("%d",j);*/
push(s,j);
}
if((x1-1>0)&&(y1+2>0)&&(x1-1<=8)&&(y1+2<=8))
{
x2=x1-1;
y2=y1+2;
j=8*x2+y2-8;
/*printf("%d",j);*/
push(s,j);
}
if((x1-1>0)&&(y1-2>0)&&(x1-1<=8)&&(y1-2<=8))
{
x2=x1-1;
y2=y1-2;
j=8*x2+y2-8;
/*printf("%d",j);*/
push(s,j);
}
if((x1+2>0)&&(y1-1>0)&&(x1+2<=8)&&(y1-1<=8))
{
x2=x1+2;
y2=y1-1;
j=8*x2+y2-8;
/*printf("%d",j);*/
push(s,j);
}
if((x1+2>0)&&(y1+1>0)&&(x1+2<=8)&&(y1+1<=8))
{
x2=x1+2;
y2=y1+1;
j=8*x2+y2-8;
/*printf("%d",j);*/
push(s,j);
}
if((x1-2>0)&&(y1+1>0)&&(x1-2<=8)&&(y1+1<=8))
{
x2=x1-2;
y2=y1+1;
j=8*x2+y2-8;
/*printf("%d",j);*/
push(s,j);
}
if((x1-2>0)&&(y1-1>0)&&(x1-2<=8)&&(y1-1<=8))
{
x2=x1-2;
y2=y1-1;
j=8*x2+y2-8;
/*printf("%d",j);*/
push(s,j);
}
do
{
j=pop(s);
x2=ag[j].x;
y2=ag[j].y;
p=(listnode*)malloc(sizeof(listnode));
p->vec=j;
p->x=x2;
p->y=y2;
p->link=ag[i].link;
ag[i].link=p;
/*printf("%d(%d,%d)",p->vec,p->x,p->y);*/
p=(listnode*)malloc(sizeof(listnode));
p->vec=i;
p->x=x1;
p->y=y1;
p->link=ag[j].link;
ag[j].link=p;
/*printf("%d(%d,%d)",p->vec,p->x,p->y);*/
}while(s->top>=0);
}
}
voiddfs(intv)
{
listnode*p;
inti;
flag[v]=1;
printf("(%d,%d)",ag[v].x,ag[v].y);
p=ag[v].link;
while(p!
=NULL)
{
i=p->vec;
if(flag[i]==0)
dfs(i);
p=p->link;
}
}
/*voidblt(listnodeag[M],intn)
{
inti;
intflag[M];
for(i=1;i<=n;i++)
flag[i]=0;
for(i=1;i<=n;i++)
if(flag[i]==0)
dfs(ag,i,flag);
}*/
voidmain()
{
inti;
creatlist();
printf("Pleaseinputstartpos.(1-64):
");
scanf("%d",&i);
printf("\n");
dfs(i);
}
实验总结:
通过本次实验,我基本掌握了本章学习的栈的简单的运用方法,要达到熟练灵活的运用,还要努力学习的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 顺序 循环 队列 存储 实现 棋盘 算法