#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. 2015 Multi-University Training Contest 5 hdu 5352 MZL's City

    MZL's City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  2. LaTeX 插图片

    本系列文章由 @YhL_Leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50240371 这里列出3种LaTeX中 ...

  3. Java IO(三) 之 FileInputStream

    前言: 对于文件系统中的文件.都能够使用FileInputStream流类以二进制的形式进行读取.可是因为Java本身的定位在JVM之上,没有处理计算机底层的能力.因此一些涉及底层处理的方法都是使用n ...

  4. HDU 4310 Contest 2

    贪心,注意排序条件. #include <iostream> #include <cstdio> #include <algorithm> using namesp ...

  5. php抽奖、随机广告算法

    我们先完毕后台PHP的流程,PHP的主要工作是负责配置奖项及相应的中奖概率,当前端页面点击翻动某个方块时会想后台PHP发送ajax请求,那么后台PHP依据配置的概率,通过概率算法给出中奖结果,同一时候 ...

  6. html5中调用摄像头拍照

    方法: getCamera: 获取摄像头管理对象 对象: Camera: 摄像头对象 CameraOption: JSON对象.调用摄像头的參数 PopPosition: JSON对象,弹出拍照或摄像 ...

  7. 公布自己的pods到CocoaPods trunk 及问题记录

    这两天准备把之前写的一些小玩意加入到pods库中去,參考了一些资料后进行操作,实际中也遇到了一些问题,记录下来.问题及解决方案在后面. 參考内容转载例如以下: 首先更新了用trunk之后,CocoaP ...

  8. hdoj--2180--时钟(数学)

    时钟 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. nyoj--1023--还是回文(动态规划)

    还是回文 时间限制:2000 ms  |           内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母) ...

  10. sql/plus无法显示数据库问题

    登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ( ...