栈与队列应用:迷宫问题(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 ...
随机推荐
- GitLab 无仓库 中了勒索病毒
坑爹的记录一下,并没有解决 Gitlab 昨天(2021-11-29)打开之后看不到项目了,下面这个吊样子 最后发现中病毒了,一堆的这个吊毛文件,复制一个打开看了一下 你别说这个黑客网页写的还不错,这 ...
- Node: 使用nvm切换node版本
软件下载 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.7 解压并安装 双击程序一路安装即可.安装完成后,在控制台输入nvm出 ...
- QTextEdit的使用
import sys from PyQt5.QtWidgets import QApplication, QWidget, QTextEdit,QVBoxLayout, QPushButton cla ...
- HTTPS 是这样握手的
HTTP协议默认是明文传输,存在一定的安全隐患,容易被中间人窃听和攻击,在 加密解决HTTP协议带来的安全问题 中提到使用哈希.对称加密.非对称加密等方式对数据加密,能解决数据安全的问题. 以上加密方 ...
- 新一代开源流数据湖平台Apache Paimon入门实操-下
@ 目录 实战 写表 插入和覆盖数据 更新数据 删除数据 Merge Into 查询表 批量查询 时间旅行 批量增量查询 流式查询 时间旅行 ConsumerID 查询优化 系统表 表指定系统表 分区 ...
- jdk安装自动化
写个在linux环境安装Java的脚本(install_java.sh),只需将jdk上传至/opt目录下,执行脚本即可. #!/bin/bash #author:zhangyl #本安装使用jdk版 ...
- 《高级程序员 面试攻略 》RocketMQ 如何保证顺序性
RocketMQ 提供了一种称为顺序消息的机制来确保消息的顺序性.下面是一些关键的方法和概念: 1. 顺序消息:顺序消息是指在发送和消费过程中,消息按照特定的顺序进行处理.RocketMQ 通过将消息 ...
- Django视图与网址进阶
1. 采用/add/?a=4&b=5这样get方法进行 1)修改learn/views.py文件 代码: #增加新函数 def add(request): a=request.GET['a'] ...
- [超详细]SpringBoot整合WebSocket
1. 什么是WebSocket? WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它允许在浏览器和服务器之间进行实时的.双向的通信.相对于传统的基于请求和响应的 HTTP 协议, ...
- Elasticsearch之常用术语
一. 数据库和ES简单类比 关系型数据库 表(Table) 行(Row) 列(Cloumn) Schema SQL Elasticsearch 索引(Index) 文档(Document) 字段(Fi ...