栈与队列应用:迷宫问题(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 ...
随机推荐
- 跟进 .NET 8 Blazor 之 ReuseTabs 支持 Query 属性绑定
ASP.NET 团队和社区在 .NET 8 继续全力投入 Blazor,为它带来了非常多的新特性,特别是在服务端渲染(SSR)方面,一定程度解决之前 WASM 加载慢,Server 性能不理想等局限性 ...
- SQL: Unknown collation: 'utf8mb4_0900_ai_ci'
错误原因 字符集错误,我的版本是5.7,文件中是8.0 解决方案 替换字符集 utf8mb4_0900_ai_ci替换为utf8_general_ci utf8mb4替换为utf8 注意:注释中的部分 ...
- Mysql高级5-SQL优化
一.插入数据优化 1.1 批量插入 如果有多条数据需要同时插入,不要每次插入一条,然后分多次插入,因为每执行一次插入的操作,都要进行数据库的连接,多个操作就会连接多次,而一次批量操作只需要连接1次 1 ...
- 2023牛客暑期多校训练营5 ABCDEGHI
比赛链接 A 题解 知识点:莫队,树状数组. 区间询问显然可以离线莫队,考虑端点移动对答案的影响. 不妨先考虑右端点右移一个位置,对答案的改变.假设右端点右移后在 \(r\) ,我们先要知道 \([l ...
- js面向对象编程,你需要知道这些
javascript中对象由key和value组成,key是标识符,value可以为任意类型 创建对象的方式 1.通过构造函数 var obj = new Object() obj.name = 'a ...
- [postgresql]逻辑备份与还原
前言 Postgres提供pg_dump和pg_dumpall用于数据库逻辑备份. pg_dumpall:将一个PostgreSQL数据库集群全部转储到一个脚本文件中 pg_dump:可以选择一个数据 ...
- HTML5CSS3提高
1 HTML5新特性 1.1 概述 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签.新的表单和新的表单属性等. 这些新特性都有兼容性问题,基本是 IE9+ 以上版本的浏览器才支持,如 ...
- Callback Function Essence
Include Example Input: I am a. route execute finish. I am b. route execute finish. What is Callback ...
- RocketMQ 系列(二) 环境搭建
RocketMQ 系列(二) 环境搭建 上一个章节对于 RocketMQ 作了一些概念上的介绍,如果你对于 RocketMQ 没有概念,不妨先看RocketMQ系列(一) 基本介绍. 这个章节主要介绍 ...
- Java开发面试--Redis专区
1. 什么是Redis?它的主要特点是什么? 答: Redis是一个开源的.基于内存的高性能键值对存储系统.它主要用于缓存.数据存储和消息队列等场景. 高性能:Redis将数据存储在内存中,并采用单线 ...