#include <iostream>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
using namespace std;
int mazeMap[100][100];
typedef struct
{
int x,y;
}PosType;
typedef struct
{
PosType seat;
int di;
}SElemType,MazeType;
typedef struct{
MazeType *base;
MazeType *top;
int stacksize;
}MazeStack;
MazeStack S;
typedef int Status;
Status InitStack(MazeStack &S);
Status StackEmpty(MazeStack &S);
Status Push(MazeStack &S, MazeType &e);
Status GetTop(MazeStack s,MazeType &e);
Status Pop(MazeStack &S, MazeType &e); Status MazePath(PosType start, PosType end);
Status Pass(PosType &pos);
void FootPrint(PosType pos);
PosType NextPos(PosType curPos, int &i);
void MakePrint(PosType pos);
int Long,wide;
void interface()
{
cout<<"**请选择**********"<<endl;
cout<<"* 1查询 *"<<endl;
cout<<"* 2退出 *"<<endl;
cout<<"******************"<<endl;
}
int main()
{
while(1)
{
//system("cls");
interface();
int cho;
cin>>cho;
if(cho==1)
{
memset(mazeMap,0,sizeof(mazeMap));
cout<<"请输入迷宫大小"<<endl;
cin>>Long>>wide;
for(int i = 0;i <= wide;i++)
{
mazeMap[0][i] = 1;
mazeMap[Long+1][i] = 1;
}
for(int i = 0;i <= Long;i++)
{
mazeMap[i][0] = 1;
mazeMap[i][wide+1] = 1;
}
int num;
cout<<"请输入障碍点个数"<<endl;
cin>>num;
int x,y;
cout<<"请输入障碍点坐标"<<endl;
{
for(int i=0;i<num;i++)
{
cin>>x>>y;
mazeMap[x][y]=1;
}
}
PosType Start, End;
Start.x = 1;
Start.y = 1;
End.x = Long;
End.y = wide;
system("cls");
cout<< "起始点为(1,1)"<<endl;
cout<< "出口为("<<Long<<","<<wide<<")"<<endl;
cout<<"迷宫为:"<<endl;
for(int i=0;i<=Long+1;i++)
{
for(int j=0;j<=wide+1;j++)
cout << mazeMap[i][j];
cout << endl;
}
if(MazePath(Start, End)){
cout << "走通迷宫" << endl;
int pri[1000][2];
int temp=0;
while(!StackEmpty(S)){
MazeType tem;
pri[temp][0]=S.top->seat.x;
pri[temp++][1]=S.top->seat.y;
Pop(S,tem);
}
cout<<"(1,1)";
for(int i=temp-1;i>0;i--)
{
cout<<"->("<<pri[i][0]<<","<<pri[i][1]<<")";
}
cout<<endl;
}
else
cout << "走不通迷宫" << endl; }
else if(cho==2)
{
break;
}
else{
system("cls");
cout<<"输入错误,请重新输入"<<endl;
}
}
return 0;
}
Status InitStack(MazeStack &S)
{
S.base = (MazeType *)malloc(STACK_INIT_SIZE*sizeof(MazeType));
if(!S.base) exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push(MazeStack &S, MazeType &e)
{
if(S.top - S.base >= S.stacksize)
{
S.base = (MazeType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(MazeType));
if(S.base) exit (OVERFLOW);
S.top = S.base + S.stacksize;
S.stacksize += STACKINCREMENT;
}
*S.top++ = e;
return OK;
}
Status Pop(MazeStack &S, SElemType &e)
{
if(S.top == S.base) return ERROR;
e = * -- S.top;
return OK;
}
Status StackEmpty(MazeStack &S)
{
if(S.base == S.top)
return OK;
return ERROR;
}
Status GetTop(MazeStack S,MazeType &e)
{
if(S.top == S.base) return ERROR;
e = *(S.top-1);
return OK;
} Status MazePath(PosType Start, PosType End)
{
PosType curpos;
MazeType e;
InitStack(S);
curpos = Start;
do
{
if(Pass(curpos)==1)
{
FootPrint(curpos);
e.seat = curpos;
e.di = 1;
Push(S, e);
if(curpos.x == End.x && curpos.y == End.y)
{
return TRUE;
}
curpos = NextPos(curpos, e.di);
}
else
{
if(!StackEmpty(S))
{
Pop(S, e);
while(e.di == 4 && !StackEmpty(S))
{
MakePrint(e.seat);
Pop(S, e);
}
if(e.di < 4)
{
++e.di;
Push(S, e);
curpos = NextPos(e.seat, e.di);
}
}
}
}while(!StackEmpty(S)); return FALSE;
}
Status Pass(PosType &pos)
{
if(mazeMap[pos.x][pos.y] == 1)
{
return 0;
}
else{
return 1;
}
}
void FootPrint(PosType pos)
{
mazeMap[pos.x][pos.y] = -1;
}
PosType NextPos(PosType curPos, int &i)
{
switch(i)
{
case 1:
++curPos.x;
if(mazeMap[curPos.x][curPos.y] !=-1)
break;
--curPos.x;
case 2:
i = 2;
++curPos.y;
if(mazeMap[curPos.x][curPos.y] != -1)
break;
--curPos.y;
case 3:
i = 3;
--curPos.x;
if(mazeMap[curPos.x][curPos.y] != -1)
break;
++curPos.x;
case 4:
i = 4;
--curPos.y;
if(mazeMap[curPos.x][curPos.y] == -1)
{
++curPos.y;
mazeMap[curPos.x][curPos.y] =1;
}
break;
} return curPos;
}
void MakePrint(PosType pos)
{
mazeMap[pos.x][pos.y] = 1;
}

  

迷宫求解_数据结构c语言版的更多相关文章

  1. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  2. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  3. 数据结构C语言版 弗洛伊德算法实现

    /* 数据结构C语言版 弗洛伊德算法  P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...

  4. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  5. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  6. 数据结构(c语言版)文摘

    第一章  绪论 数据结构:是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科. 数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理 ...

  7. 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器

    在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...

  8. 深入浅出数据结构C语言版(5)——链表的操作

    上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游 ...

  9. 【数据结构(C语言版)系列二】 栈

    栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型. 栈的定 ...

随机推荐

  1. 洛谷 P2393 yyy loves Maths II

    P2393 yyy loves Maths II 题目背景 上次蒟蒻redbag可把yyy气坏了,yyy说他只是小学生,蒟蒻redbag这次不坑他了. 题目描述 redbag给了yyy很多个数,要yy ...

  2. Qt之二维码扫描

    简述 二维码(QR Code)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的.是所有信息数据的一把钥匙.应用十分广泛,如:产品防伪/溯源.广告推送.网站链接. ...

  3. Django连接mysql

    链接文档地址:https://docs.djangoproject.com/zh-hans/2.0/intro/tutorial02/ 由于我使用的是mysql,所以设置的是mysql的: 在mysl ...

  4. java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com

    错误如题. 原因:web.xml中的servlet映射<url-pattern> 配置错误 改动正确就可以. 我直接删除了,bug就攻克了. 另一个问题是 xxx.jar fail to ...

  5. Mosquito的优化——epoll优化(七)

    本文由逍遥子撰写,转发请标注原址: http://blog.csdn.net/houjixin/article/details/46413583 或 http://houjixin.blog.163. ...

  6. ThinkPHP5.0最最最最最简单实例

    ThinkPHP5.0最最最最最简单实例 一.效果图 二.操作步骤 1.用mysql数据库建立数据库 2.按照ThinkPHP官网的指示装好ThinkPHP5.0 tp5里面的目录结构如下: 3.配置 ...

  7. MYSQL INT(N)以及zerofill的使用区别

    MYSQL中,int(n)括号里面的数据n无论写成多少,都是占4个字节的空间,最多能够存10位数.N不代表能够存多少位数,显示宽度M与数据所占用空间,数值的范围无关. 如果在定义字段的时候指定zero ...

  8. SharePoint 使用Expression Web 设计网站

    创建好网站以后可就可以开始发布了 possible causes : 1.The web server may not hava the FrontPage Server Extensions ins ...

  9. 基于Asp.Net webApi owin oauth2的实现

    干货地址:https://git.oschina.net/DpMa_/WebApi-Owin-oauth2

  10. MyBatis数据持久化(二)建立数据库会话

    上篇文章中介绍了我们使用mybatis前的准备工作,并在程序中通过jdbc与mysql数据库成功建立连接,接下来介绍如何使用mybatis与数据库建立会话.我们需要以下几个步骤: 1.在build p ...