C语言与数据结构课程设计报告

C语言与数据结构课程设计报告本文简介:C语言与数据结构课程设计报告学号2011013759姓名俞杰课程设计题目迷宫求解小组成员俞杰安飞洪飞2012年12月目录1需求分析1.1功能与数据需求1.1.1题目要求的功能1.1.2扩展功能1.2界面需求1.3开发环境与运行需求2概要设计2.1主要数据结构2.2程序总体结构2.3各模块函数说明3详
C语言与数据结构课程设计报告本文内容:
C语言与数据结构课程设计报告
学
号
2011013759
姓
名
俞杰
课程设计题目
迷宫求解
小组成员
俞杰
安飞
洪飞
2012
年
12
月
目
录
1
需求分析
1.1
功能与数据需求
1.1.1
题目要求的功能
1.1.2
扩展功能
1.2
界面需求
1.3
开发环境与运行需求
2
概要设计
2.1主要数据结构
2.2程序总体结构
2.3各模块函数说明
3
详细设计
3.1算法分析与设计
3.2主要程序段设计
4
测试
5
使用说明
5.1应用程序功能的详细说明
5.2应用程序运行环境要求
5.5输入数据类型、格式和内容限制
6
总结提高
6.1课程设计总结
6.2开发中遇到的问题和解决方法
6.3
对自己完成课设完成情况的评价
6.4《C语言与数据结构课程设计》课程的意见与建议
附录:程序源代码
1
需求分析
1.1
功能与数据需求
1.1.1
题目要求的功能
以一个m×n的长方形表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
测试数据:迷宫的测试数据如下:左上角(1,1)为入口,右下角(9,8)为出口。
0
0
1
0
0
0
1
0
0
0
1
0
0
0
1
0
0
0
0
0
1
1
0
1
0
1
1
1
0
0
1
0
0
0
0
1
0
0
0
0
0
1
0
0
0
1
0
1
0
1
1
1
1
0
0
1
1
1
0
0
0
1
0
1
1
1
0
0
0
0
0
0
1
2
3
4
5
6
7
8
1.1.2
扩展功能
(1)编写递归形式的算法,求得迷宫中所有可能的通路;
(2)以方阵形式输出迷宫及其通路。
1.2
界面需求
输入行数和列数
输入每一行中的通路(0,0)和障碍(1,1).
输入入口坐标(1,1)和出口坐标(m,n).
1.3
开发环境与运行需求
开发环境
Microsoft
Visual
C++
6.0
最低运行需求
windows
xp
;32位系统
2
概要设计
2.1主要数据结构:
typedef
struct
/*用于存放迷宫的位置和该点信息*/
{
int
x,y,d;
}Datatype;
typedef
struct
/*该栈用于存储走过的结点*/
{
Datatype
data[MAXSIZE];
int
top;
}Sqstack,*PSqstack;
typedef
struct
/*用于存放当前结点可走的四个方向*/
{
int
x,y;
}item;
2.2程序总体结构
输入起始位置,终点位置
判断首节点是否为通路
判断路径能否走通
对坐标标记
是否到达迷宫出口处
南边是否存在通路
东边是否存在通路
北边是否存在通路
存储路径,将路径入栈
有解迷宫
无解迷宫
Y
N
Y
N
Y
输出迷宫
选择路径
西边是否存在通路
打印所走的路径
2.3各模块函数说明
PSqstack
Init_Sqstack()
/*初始化空栈*/
int
Push_Sqstack(PSqstack
s,Datatype
x)
/*入栈*/
int
Pop_Sqstack(PSqstack
s,Datatypex)
/*出栈*/
void
Destroy_Sqstack(PSqstacks)
/*销毁栈*/
int
Mazepath(int
maze[][n+2],int
x0,int
y0)
/*求迷宫路径函数,入口参数:
指向迷宫数组的指针,开始点(x0,y0)*/
Pop_
Sqstack(s,Push_Sqstack(t,temp);
/*栈t是栈s的逆,因为s保存
的途径是反的,加t
使输出的途径变为正*/
3
详细设计
3.1算法分析与设计
思路:计算机解迷宫通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进;否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通路。假如所有可能的通路都探索到而未能到达出口,则所设定的迷宫没有通路。
实现:假设“当前位置”指的是“在收索过程中某一时刻所在图中某个方
块位置”,则求迷宫中的一条路径的算法的基本思想是:若当前位置“可通”,
则纳入“当前路径”,并继续朝“下一位置”探索,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”则应该顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。所谓“下一位置”指的是“当前位置”四周4个方向(东·南·西·北)上相邻的方块。假设以栈S记录“当前路径”,则栈顶中存放的是“从当前路径上最后一个通道块”。由此,“纳入路径”的操作即为“当前位置入栈”;“从当前路径上删除前一通道块”的操作即为“入栈”
。
3.2主要程序段设计
void
main()
{
int
i,j;
int
maze[m+2][n+2];
printf(“请输入迷宫矩阵:9*8\n“);
for(i=0,j=0;itop!=-1)
{
Pop_Seqstack(s,x=temp.x;
y=temp.y;
d=0;
/*将方向重新定位为右方,即move[0]*/
while(dtop!=-1)
{
Pop_Seqstack(s,Push_Seqstack(t,temp);
/*栈t是栈s的逆,因为s保存的途径是反的,加t使输出的途径变为正*/
}
Destroy_Seqstack(
/*销毁栈*/
while(t->top!=-1)
/*打印走过的途径*/
{
Pop_Seqstack(t,printf(““,temp.x,temp.y,temp.d);
}
printf(““,m,n);
Destroy_Seqstack(
/*销毁栈*/
return
OK;
}
else
d=0;
/*将方向定位为右方*/
}
else
d++;
/*尝试其
他方向是否可走*/
}
}
printf(“该迷宫无法走出\n“);
Destroy_Seqstack(
return
ERROR;
}
}
Mazepath函数
{if(迷宫入口或迷宫是否有通路)
Printf(“输入迷宫数据错误“);
else
{对move定义为向四个方向探索的数组
初始化栈s,t;
迷宫入口点入栈
While(判断s是否为空)
{
入口参数:指向迷宫数组的指针,开始点(x0,y0)
while(d
#include
#define
MAXSIZE
100
#define
ERROR
0
#define
OK
1
#define
m
9
#define
n
8
typedef
struct
/*用于存放迷宫的位置和该点信息*/
{
int
x,y,d;
}Datatype;
typedef
struct
/*该栈用于存储走过的结点*/
{
Datatype
data[MAXSIZE];
int
top;
}Sqstack,*PSqstack;
typedef
struct
/*用于存放当前结点可走的四个方向*/
{
int
x,y;
}item;
PSqstack
Init_Sqstack()
/*初始化空栈*/
{
PSqstack
s;
s=(PSqstack)malloc(sizeof(Sqstack));
if(s)
s->top=-1;
return
s;
}
int
Push_Sqstack(PSqstack
s,Datatype
x)
/*入栈*/
{
if(s->top==MAXSIZE-1)
return
ERROR;
/*栈满不能入栈*/
else
{
s->top++;
s->data[s->top]=x;
return
OK;
}
}
int
Pop_Sqstack(PSqstack
s,Datatypex)
/*出栈*/
{
if(!s)
return
ERROR;
/*栈控不能出栈*/
else
{x=s->data[s->top];
s->top--;
return
OK;
}
}
void
Destroy_Sqstack(PSqstacks)
/*销毁栈*/
{
if(*s)
free(*s);s=NULL;
return;
}
int
Mazepath(int
maze[][n+2],int
x0,int
y0)
/*求迷宫路径函数,入口参数:指向迷宫数组的指针,开始点(x0,y0)*/
{
PSqstack
s,t;
Datatype
temp;
int
x,y,d,i,j;
item
move[4];
if(maze[1][1]==1||maze[m][n]==1)
printf(“输入迷宫数据错误,起点和终点应为:0\n“);
else
{
move[0].x=0;
move[0].y=1;
move[1].x=1;
move[1].y=0;
move[2].x=0;
move[2].y=-1;
move[3].x=-1;
move[3].y=0;
/*对move定义为向四个方向探索的数组*/
s=Init_Sqstack();
/*初始化栈s*/
t=Init_Sqstack();
/*初始化栈t*/
if(!s)
{
printf(“栈初始化失败\n“);
return
(0);
}
temp.x=x0;
temp.y=y0;
temp.d=0;
Push_Sqstack(s,temp);
/*迷宫入口点入栈*/
while(s->top!=-1)
{
Pop_Sqstack(s,x=temp.x;
y=temp.y;
d=0;
/*将方向重新定位为右方,即move[0]*/
while(dtop!=-1)
{
Pop_Sqstack(s,Push_Sqstack(t,temp);
/*栈t是栈s的逆,因为s保存的途径是反的,加t使输出的途径变为正*/
}
Destroy_Sqstack(
/*销毁栈*/
while(t->top!=-1)
/*打印走过的途径*/
{
Pop_Sqstack(t,printf(““,temp.x,temp.y,temp.d);
}
printf(““,m,n);
Destroy_Sqstack(
/*销毁栈*/
return
OK;
}
else
d=0;
/*将方向定位为右方*/
}
else
d++;
/*尝试其他方向是否可走*/
}
}
printf(“该迷宫无法走出\n“);
Destroy_Sqstack(
return
ERROR;
}
}
void
main()
{
int
i,j;
int
maze[m+2][n+2];
printf(“请输入迷宫矩阵:9*8\n“);
for(i=0,j=0;i /*将迷宫四周赋值为1,即不可走*/ maze[i][j]=1; for(i=0,j=0;j maze[i][j]=1; for(i=0,j=n+1;i maze[i][j]=1; for(i=m+1,j=0;j maze[i][j]=1; for(i=1;i /*给迷宫赋值*/ { for(j=1;j scanf(“%d“,} for(i=0;i /*打印迷宫*/ { for(j=0;j { if(maze[i][j]==0) printf(““); else printf(“#“); } printf(“\n“); } Mazepath(maze,1,1); }
