栈与队列应用:迷宫问题(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 ...
随机推荐
- 【go语言】1.1.2 Go 语言的特性
1. 简洁的语法 Go 语言的语法设计上非常简洁明了,没有复杂的继承和泛型,也没有异常处理,但这并不影响它的功能性和表达力.这使得 Go 语言容易学习和使用. 例如,以下是一个简单的 Go 函数,用于 ...
- 叶绿素含量测定仪SPAD-502怎么使用?
本文介绍基于SPAD-502叶绿素仪测定植被叶片叶绿素含量的方法. SPAD-502是由日本柯尼卡美能达(Konica Minolta)株式会社生产的轻便.手持式叶绿素仪,可以在不破坏作物的情 ...
- Topic太多,RocketMQ炸了!
网上博客常说,kafka的topic数量过多会影响kafka,而RocketMQ不会受到topic数量影响. 但是,果真如此吗? 最近排查一个问题,发现RocketMQ稳定性同样受到topic数量影响 ...
- OpenLayers示例
http://develop.smaryun.com:81/API/JS/OL3InterfaceDemo/index.htm
- 开机自动打开termux以及启动termux的服务
ps:因为我们的服务是安装在平板上面的termux,客户不想维护麻烦,如果平板重启之后还需要手动启动ternux,还要开启命令启动服务,这样比较麻烦,所以研究如下操作 1.安装macroDroid 直 ...
- [Lua][Love Engine] 打砖块游戏实现过程与知识点
本文旨在根据LOVE2D官方文档和教程实现打砖块的游戏,记录部分实现过程和重要知识点 目标摧毁所有砖块 玩家控制球拍左右滑动反弹小球 小球摧毁砖块 小球保持在屏幕内 小球碰到屏幕底部,GAME OVE ...
- 反汇编ARM程序的技术靠谱吗?——揭秘ARM架构二进制程序的反汇编技术现状
本文系原创,转载请说明出处 Please Subscribe Wechat Official Account:信安科研人,获取更多的原创安全资讯 参考发表在2020年软工顶会ISSTA的论文&l ...
- 《Kali渗透基础》07. 弱点扫描(一)
@ 目录 1:漏洞发现 1.1:Exploit-DB 1.2:searchsploit 1.3:nmap 2:漏洞管理 3:弱点扫描类型 4:漏洞基本概念 4.1:CVSS 4.2:CVE 4.3:O ...
- LeetCode952三部曲之二:小幅度优化(137ms -> 122ms,超39% -> 超51%)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<LeetCode952三部曲& ...
- Socket.io入门
Socket.io入门 根据官方文档socket.io使用必须客户端根服务端一致,socket.io不兼容webSocket或者其他模块,因为socket.io在连接时做了自定义处理, 所以不同的长连 ...