栈与队列应用:迷宫问题(DFS非最短路径)
//先输入行列,在输入迷宫 以-1 -1 结束
#include<stdio.h>
#include<stdlib.h> #define MAXSIZE 100
#define ERROR -1
#define OK 1 struct Direction
{
int incX; //增量
int incY;
}; Direction direct[4] = { {0,1},{1,0},{0,-1},{-1,0} };//方向试探 struct Box
{
int x, y; //当前访问的迷宫格子的纵横坐标
int di; //当前方向
}; typedef struct //用Box声明栈来存放数据
{
Box* base;
Box* top;
int stackSize;
}SqStack; void InitStack(SqStack* s)
{
s->base = (Box *)malloc(sizeof(Box) * MAXSIZE);
if (s->base == NULL)
{
exit(0);
}
s->top = s->base;
s->stackSize = MAXSIZE;
} void Push(SqStack* s, Box e)
{
if (s->top - s->base == s->stackSize)
{
exit(0);
}
*(s->top) = e;
(s->top)++;
} void Pop(SqStack* s, Box* e)
{
if (s->top == s->base)
{
return;
}
*e = *--(s->top);
} int StackLen(SqStack s)
{
return (s.top - s.base);
} int isEmptyStack(SqStack* s) //判断栈是否为空 是返回1 不是返回-1
{
if (s->top == s->base) //栈为空
{
return 1;
}
else //栈不为空
{
return 0;
}
} int** CreatMaze(int M, int N) //初始化
{
int** maze; maze = (int **)malloc(sizeof(int*) * M); //行
for (int i = 0; i < N; i++)
{
maze[i] = (int *)malloc(sizeof(int) * N); //列
} for (int i = 0; i < M; i++) //将边界置为1
{
for (int j = 0; j < N; j++)
{
maze[i][j] = 1;
}
} for (int i = 1; i < M-1; i++) //输入
{
for (int j = 1; j < N-1; j++)
{
scanf("%d", &maze[i][j]);
}
} return maze;
} bool findPath(int M, int N, Direction direct[], SqStack* s)
{
int** maze;
Box temp,e;
int x, y, di; //当前正在处理的单元行列
int line, col; //将要处理的下一个单元行列
int flag = 0; maze = CreatMaze(M + 2, N + 2); //初始化 maze[1][1] = -1;
temp = { 1,1,-1 };
Push(s, temp); while (!isEmptyStack(s)) //栈不为空循环继续
{
Pop(s, &temp); //如果路走不通就回退
x = temp.x;
y = temp.y;
di = temp.di + 1; //第一步先往右边走 while (di < 4) //尝试四个方向
{
line = x + direct[di].incX;
col = y + direct[di].incY;
if (maze[line][col] == 0)
{
temp = { x,y,di };
Push(s, temp);
x = line;
y = col;
maze[line][col] = -1;
if (x == M && y == N)
{
return true;
}
else
{
di = 0;
}
}
else
{
di++;
}
}
} return false;
} int main(void)
{
int M, N;
bool tem;
SqStack s;
Box e;
while (1)
{
InitStack(&s);
scanf("%d %d", &M, &N);
if (M == -1)
break;
tem = findPath(M, N, direct, &s); if (tem)
{
while (s.base != s.top)
{
printf("%d,%d\n", s.base->x, s.base->y);
s.base++;
}
printf("%d,%d\n", M, N);
}
else
{
printf("NO FOUND");
}
} return 0;
}
栈与队列应用:迷宫问题(DFS非最短路径)的更多相关文章
- 数据结构之 栈与队列--- 走迷宫(深度搜索dfs)
走迷宫 Time Limit: 1000MS Memory limit: 65536K 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方 ...
- YTU 3006: 迷宫问题(栈与队列)
3006: 迷宫问题(栈与队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 3 解决: 1 题目描述 编写一个求解迷宫问题的程序,要求输出迷宫的所有路径,并求最短路径长度及最短路径 ...
- SDUT-2449_数据结构实验之栈与队列十:走迷宫
数据结构实验之栈与队列十:走迷宫 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个由n * m 个格子组成的迷宫,起 ...
- 剑指Offer面试题:6.用两个栈实现队列
一.题目:用两个栈实现队列 题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 原文是使用 ...
- C实现栈和队列
这两天再学习了数据结构的栈和队列,思想很简单,可能是学习PHP那会没有直接使用栈和队列,写的太少,所以用具体代码实现的时候出现了各种错误,感觉还是C语言功底不行.栈和队列不论在面试中还是笔试中都很重要 ...
- Java数据结构和算法之栈与队列
二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为 ...
- 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...
- YTU 3005: 皇后问题(栈和队列)
3005: 皇后问题(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 6 解决: 3 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不 ...
- YTU 3004: 栈的基本运算(栈和队列)
3004: 栈的基本运算(栈和队列) 时间限制: 1 Sec 内存限制: 128 MB 提交: 32 解决: 10 题目描述 编写一个程序,实现顺序栈的各种基本运算,主函数已给出,请补充每一种方法 ...
- ACM YTU 十进制与八进制的转换 (栈和队列) STL栈调用
十进制与八进制的转换(栈和队列) Description 对于输入的任意一个非负十进制整数,利用栈打印输出与其等值的八进制数. Input 111 Output 157 Sample Input 14 ...
随机推荐
- java读取txt文件解决乱码问题
说明:由于txt文件有bom和不同的编码方式,导致导入数据时产生乱码,以下代码完美解决乱码问题. 参考他人代码,结合自己的业务加工完成,费了大半天功夫完成,希望对大家有点用处. 废话不多说,直接上代码 ...
- 【Python】@property用法简述
参考自:Python的@property是干嘛的?作者:Python测试开发 如果我们设置类的属性私有化,那么可以使用@property 使属性可以被外部访问并修改. 在使用 @property 之前 ...
- buu-(ACTF新生赛2020)usualCrypt
base64的常用套路了 文件直接给base,我大胆盲猜base64: 先进sub-401080函数康康: 先看byte-40e0a0 这个很明显了,然后看上面的函数 进这连个地址发现是base64加 ...
- Web安全漏洞解决方案
1.已解密的登录请求 推理: AppScan 识别了不是通过 SSL 发送的登录请求. 测试请求和响应: 1.1.1 产生的原因 登录接口,前端传入的密码参数没有经过md5的加密就直接传给了后端 1. ...
- 如何实现IP话机接入交换机?
组网图形 简介 如果语音设备支持LLDP协议,并且支持通过network-policy TLV字段获取语音VLAN,可以在交换机上配置命令lldp tlv-enable med-tlv network ...
- RocketMQ 系列(二) 环境搭建
RocketMQ 系列(二) 环境搭建 上一个章节对于 RocketMQ 作了一些概念上的介绍,如果你对于 RocketMQ 没有概念,不妨先看RocketMQ系列(一) 基本介绍. 这个章节主要介绍 ...
- 【项目源码】JavaWeb网上购书系统
JavaWeb网上购书系统 介绍 采用JSP.Servlet.MySQL.Tomcat8.0开发的网上购书系统. 软件架构 网上书城主要功能如下: (1) 前台(客户购买)部分: ① 用户管理:注册会 ...
- word2010中统一调整表格格式
word中统一调整表格格式基本思路是: 1.选中所有的表格. 2.再对表格格式调整. 选中所有表格需要用到宏,操作很简单,具体操作如下: (1)工具栏"视图"下右下角&quo ...
- FFmpeg中的常用结构体分析
一.前言 在学习使用FFmpeg进行编解码时,我们有必要先去熟悉FFmpeg中的常用结构体,只有对它们的含义和用途有深刻的了解,我们才能为后面的学习打下坚实的基础.所以,这篇文章将会介绍这些常用的结构 ...
- 全局安装oh-my-zsh保姆教程
我的系统是CentOS 7.6,按流程走完后可以实现系统内所有用户都默认使用zsh且插件配置共享省去重复编写配置或软连接的烦恼 1 安装git yum -y install git 2 安装zsh y ...