应用栈解决迷宫问题的C语言实现
题目来自于严蔚敏《数据结构》,参考伪代码实现的程序:
#include <stdio.h>
#include <malloc.h>
//记录通道块在迷宫矩阵当中的横、纵坐标
struct Position{
int x;
int y;
};
//放入栈当中的通道块元素
struct SElement {
int ord;//记录此通道块在整个通道当中的次序
Position p;//记录此通道块在矩阵当中的位置
int di;//记录下一次测试这一路径的临近路径的位置
};
//创建栈数据结构
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
struct MyStack{
SElement* base;
SElement* top;
int stacksize;
};
//创建一个栈如果创建成功则返回1,否则就返回0
int InitStack(MyStack* s)
{
s->base=(SElement*)malloc(STACK_INIT_SIZE*sizeof(SElement));//为栈分配初始空间
if(!s->base) return ;
s->top=s->base;//设定为空栈
s->stacksize=STACK_INIT_SIZE;
return ;
}
//判断栈是否为空,如果是空的就返回0,否则就返回1
int IsStackEmpty(MyStack* s)
{
if(s->top==s->base) return true;
return false;
}
//获取栈顶元素,如果栈为空就返回0 否则就返回1
int GetTop(MyStack* s,SElement* e)
{
if(IsStackEmpty(s)) return ;
e=s->top-;
return ;
}
//获取栈的长度,并且通过程序返回
int StackLength(MyStack* s)
{
return s->top-s->base;
}
//插入元素e为新的栈顶元素,插入成功则返回1,否则返回0
int Push(MyStack* s,SElement e)
{
if(s->top-s->base>=STACK_INIT_SIZE)
{
s->base=(SElement*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(SElement));
if(!s->base) return ;
s->top=s->base+s->stacksize;
s->stacksize+=STACKINCREMENT;
}
*(s->top)=e;
s->top++;
return ;
}
//弹出栈顶元素赋值给e弹出成功返回1,弹出失败返回0
int Pop(MyStack* s,SElement* e)
{
if(IsStackEmpty(s)) return ;
*e=*(s->top-);
s->top--;
return ;
}
//定义墙元素为2 可走路径为0 已知路径为curStep 不能够通过的路径为-1
#define MazeScale 10
int Maze[MazeScale][MazeScale]={{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},
{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,},{,,,,,,,,,}};
//辅助函数考察当前路径能否通过
bool Pass(Position posi)
{
//只有路径所在位置的数字为0的是可以走的
if(Maze[posi.x][posi.y]==)
{
return true;
}
return false;
}
//按顺时针方向从东开始寻找矩阵当中某一个位置的临近位置
Position NextPosition(Position now,int direction)
{
Position next;
int x=now.x;
int y=now.y;
switch(direction)
{
//东
case :{
next.x=x;
next.y=y+;
break;
}
//南
case :{
next.x=x+;
next.y=y;
break;
}
//西
case :{
next.x=x;
next.y=y-;
break;
}
//北
case :
{
next.x=x-;
next.y=y;
break;
}
default:break;
}
return next;
}
//留下足迹
void FootPrint(Position p,int step)
{
Maze[p.x][p.y]=step;
}
//路径不可走的话就留下-1的标记
void MarkPrint(Position p)
{
Maze[p.x][p.y]=-;
}
int main()
{
//打印出迷宫矩阵
for(int i=;i<MazeScale;i++)
{
for(int j=;j<MazeScale;j++)
{
printf("%d ",Maze[i][j]);
}
printf("\n");
}
//迷宫程序主体
MyStack path;//记录路径的栈
InitStack(&path);//初始化路径数组
Position curp;//当前被试位置
//初始化当前位置为矩阵入口
curp.x=;
curp.y=;
int curStep=;//被探索的步数
do
{
if(Pass(curp))
{
FootPrint(curp,curStep);//可走就在迷宫里面留下足迹
//创建一个栈元素,存储可行路径的相关值,将这个元素存储到栈当中
SElement e;
e.di=;//意味着下一个被试路块为这一个路块的正上方的路块
e.ord=curStep;
e.p.x=curp.x;
e.p.y=curp.y;
Push(&path,e);//将路径块入栈
if(curp.x==MazeScale- && curp.y==MazeScale-) break; //如果被压入的路径块到了迷宫的终点就退出循环
//找到下一个被试块
curp=NextPosition(curp,);//找到前一个被试块东面的路径块作为被试块
curStep++;//被探索的步数加一
}else//如果当前被试路径不能够通过的话
{
if(!IsStackEmpty(&path))
{
SElement e;
Pop(&path,&e);
curStep--;
//将这一段所有的周围路径都已经被测试过的路径从栈中清除
while(e.di== && !IsStackEmpty(&path)){
MarkPrint(e.p);
Pop(&path,&e);
curStep--;
}
//如果当前栈顶还有未被测试的路径就测试剩余的周围路径
if(e.di<)
{
curp=NextPosition(e.p,e.di+);
e.di++;
curStep++;
Push(&path,e);
}
}
}
}while(!IsStackEmpty(&path));
printf("\n");
//打印出结果迷宫矩阵
for(int i=;i<MazeScale;i++)
{
for(int j=;j<MazeScale;j++)
{
printf("%d ",Maze[i][j]);
}
printf("\n");
}
return ;
}
应用栈解决迷宫问题的C语言实现的更多相关文章
- 递归转手工栈处理的一般式[C语言]
是任意形式的递归,是化解的一般式. 主题所谓的“递归调用化解为栈处理”,意思是,将递归函数调用化解为“一个由stack_push stack_pop stack_top等函数调用组成的循环式子”.这里 ...
- 有关dfs、bfs解决迷宫问题的个人见解
可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...
- 【Java EE 学习 69 上】【struts2】【paramsPrepareParamsStack拦截器栈解决model对象和属性赋值冲突问题】
昨天有同学问我问题,他告诉我他的Action中的一个属性明明提供了get/set方法,但是在方法中却获取不到表单中传递过来的值.代码如下(简化后的代码) public class UserAction ...
- 用栈解决Largest Rectangle问题
一问题描述 Given n non-negative integers representing the histogram's bar height where the width of each ...
- hdu 3666(差分约束,手动栈解决超时问题)
THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 用C语言解决迷宫问题
#include <stdio.h> #include <stdlib.h> #define ROW 10 #define COL 10 /*迷宫中位置信息*/ typedef ...
- 利用顺序栈解决括号匹配问题(c++)-- 数据结构
题目: 7-1 括号匹配 (30 分) 给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行 ...
- 刁肥宅详解中缀表达式求值问题:C++实现顺序/链栈解决
1. 表达式的种类 如何将表达式翻译成能够正确求值的指令序列,是语言处理程序要解决的基本问题,作为栈的应用事例,下面介绍表达式的求值过程. 任何一个表达式都是由操作数(亦称运算对象).操作符(亦称运算 ...
- 两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
一.思路:1.创建两个空栈A和B:2.A栈作为队列的入口,B栈作为队列的出口:3.入队列操作:即是入栈A:4.出队列操作:若栈B为空,则将A栈内容出栈并压人B栈,再出 B栈:不为空就直接出栈: 二.代 ...
随机推荐
- python调用win32com.client的GetObject查找进程信息及服务信息
为何不用wmi呢?因为执行很慢,为啥不用winreg?因为winreg在批量获取及遍历服务方面很不方便,于是采用这方法 该方法同命令行下的wmic执行 获取服务信息 #coding=utf8 from ...
- 转载:2.2.1 块配置项《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19626.html 块配置项由一个块配置项名和一对大括号组成.具体示例如下:events {-} http { upstream ba ...
- Ex 6_2 假设您准备一次长途旅行..._第五次作业
假设n个旅馆距离原点的距离存放在数组arr[0. . .n-1]中,punish[0. . .n-1]表示在某个旅馆停留时所受的的惩罚的最小值.当然在第一个旅馆停留时所受到的惩罚为0,即punish[ ...
- JS实现数组去重(重复的元素只保留一个)
1.遍历数组法 它是最简单的数组去重方法(indexOf方法) 实现思路:新建一个数组,遍历去要重的数组,当值不在新数组的时候(indexOf为-1)就加入该新数组中: ,,,,,,,,]; func ...
- 基于MFC的ActiveX控件开发教程------------浏览器插件之ActiveX开发
浏览器插件之ActiveX开发(一) 一般的Web应用对于浏览器插件能不使用的建议尽量不使用,因为其涉及到安全问题以及影响用户安装(或自动下载注册安装)体验问题.在有特殊需求(如涉及数据安全的金融业务 ...
- LINUX UBUNTU 快捷键
一.打开关闭终端 ctrl + alt + t //打开一个新终端 shift + ctrl +n //在打开终端的情况下再打开一个新终端shift + ctrl + q //关闭一个新终端 二.文件 ...
- poj2442 堆应用
#include <cstdio> #include <cstring> #include <string> #include <vector> #in ...
- FakeImageExploiter v1.3
FakeImageExploiter v1.3 - backdoor images.jpg[.ps1] CodeName: Metamorphosis Version release: v1.3 (S ...
- 使用RabbitMQ实现延迟任务
场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就需要设置成超时. 场景二:订单下单之后30分钟后,如果用户没有付钱,则系统自动取消订单. 上述类似的需求是我们经常会遇见的问题. ...
- hdu 1025 上面n个点与下面n个点对应连线 求最多能连有多少条不相交的线 (LIS)
题目大意有2n个城市,其中有n个富有的城市,n个贫穷的城市,其中富有的城市只在一种资源富有,且富有的城市之间富有的资源都不相同,贫穷的城市只有一种资源贫穷,且各不相同,现在给出一部分贫穷城市的需求,每 ...