迷宫求解_数据结构c语言版
#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语言版的更多相关文章
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- 数据结构C语言版 弗洛伊德算法实现
/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ...
- 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明
<数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑 链接☛☛☛ <数据结构>课本源码合辑 习题集全解析 链接☛☛☛ ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- 数据结构(c语言版)文摘
第一章 绪论 数据结构:是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科. 数据:是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理 ...
- 深入浅出数据结构C语言版(8)——后缀表达式、栈与四则运算计算器
在深入浅出数据结构(7)的末尾,我们提到了栈可以用于实现计算器,并且我们给出了存储表达式的数据结构(结构体及该结构体组成的数组),如下: //SIZE用于多个场合,如栈的大小.表达式数组的大小 #de ...
- 深入浅出数据结构C语言版(5)——链表的操作
上一次我们从什么是表一直讲到了链表该怎么实现的想法上:http://www.cnblogs.com/mm93/p/6574912.html 而这一次我们就要实现所说的承诺,即实现链表应有的操作(至于游 ...
- 【数据结构(C语言版)系列二】 栈
栈和队列是两种重要的线性结构.从数据结构角度看,栈和队列也是线性表,但它们是操作受限的线性表,因此,可称为限定性的数据结构.但从数据类型角度看,它们是和线性表大不相同的两类重要的抽象数据类型. 栈的定 ...
随机推荐
- 循环语句第3种 FOR ... in ... LOOP END LOOP;
--------第3种-------- FOR ... in ... LOOP END LOOP; BEGIN FOR i IN 1..10 LOOP dbms_output ...
- H2数据库入门使用
H2数据库入门使用 学习了: https://www.cnblogs.com/xdp-gacl/p/4171024.html http://www.cnblogs.com/xdp-gacl/p/417 ...
- C++实现页码数字统计
#include<iostream> #include<iomanip> #include<cstdlib> #include<ctime> #incl ...
- WinCE C#程序,控制启动时仅仅能启动一个程序,使用相互排斥量来实现,该实现方法測试通过
</pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_46349 ...
- JAVA性能优化的五种方式
一,JAVA性能优化之设计优化 设计优化处于性能优化手段的上层.它往往须要在软件开发之前进行.在软件开发之前,系统架构师应该就评估系统可能存在的各种潜在问题和技术难点,并给出合理的设计方案,因为软件设 ...
- C++字符串操作笔试题第二波
//1.字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成"%20". //比如输入"we are happy.".则输出"we%20are ...
- m_Orchestrate learning system---十六、如何快速在一堆字符图标中找到所需
m_Orchestrate learning system---十六.如何快速在一堆字符图标中找到所需 一.总结 一句话总结:find查找字符 比如说找teacher feedback 的图标,可以多 ...
- nyoj--214--单调递增子序列(二)(二分查找+LIS)
单调递增子序列(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序 ...
- Git 连接细节
Git 连接细节 首先创建Git 账号 https://github.com/ 下载Git https://git-scm.com/downloads 新建远程仓库 SSH keys : 打开 Git ...
- 51nod 1448 二染色问题 (逆向考虑)
题目: 注意,这题不是把一块区域的黑翻成白.白翻成黑. 是把一块区域全部翻成白或者翻成黑. 初始为全白,看能否翻出题中的情况. 我们假设翻转若干次能得到图中的形状,那么我们找出最后一次的翻转,即全W或 ...