求解迷宫路径时,使用的是循环队列,所以出队只是修改了方块在队列里的下标,并没有真正意义上的出队。
思路是:
1)先将入口(1,1)入队,在队列不为空时循环进行出队,称出队方块为当前方块;
2)如果当前方块是出口(8,8),则输出路径;
3)如果当前方块不是出口,则将当前方块邻近可走的方块全部入队,入队时要保存方块的mg[i][j]值为-1,以免重复走,并保存方块的pre值,即当前队列的front,表明上一方块在队列的中下标值,这样方便倒推路径时可通过当前方块找到上一方块。
4)输出时,通过输出当前方块,然后根据当前方块的pre值输出上一方块。
#include <stdio.h>
#include <stdlib.h>
#define M 8
#define N 8
#define MaxSize 100
int mg[M+2][N+2] = {
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}};
struct
{
int i;
int j;
int pre;
}Queue[MaxSize];
int front = -1;
int rear = -1;
void printmg(int front)
{
printf("k = %d\n", front);
int k = front,j,ns = 0;
while(k != 0)
{
j = k;
k = Queue[j].pre;
Queue[j].pre = -1;
}
printf("迷宫路径如下:\n");
k = 0;
while(k<MaxSize)
{
if(Queue[k].pre == -1)
{
ns++;
printf("\t(%d,%d) ",Queue[k].i,Queue[k].j);
if(ns%5 == 0)
printf("\n");
}
k++;
}
}
void mgpath()
{
int i = 0,j = 0,find = 0, di = -1;
rear++;
Queue[rear].i = 1; Queue[rear].j = 1; Queue[rear].pre = -1;
mg[i][j] = -1;
while(front<=rear && !find)
{
front++;
i = Queue[front].i; j = Queue[front].j;
if(i == M && j == N)
{
find = 1;
printmg(front);
//return ;
}
for(di=0;di<4;di++)
{
switch(di)
{
case 0:i = Queue[front].i - 1;j = Queue[front].j;break;
case 1:i = Queue[front].i;j = Queue[front].j + 1;break;
case 2:i = Queue[front].i + 1;j = Queue[front].j;break;
case 3:i = Queue[front].i;j = Queue[front].j - 1;break;
}
if(mg[i][j] == 0)
{
rear++;
Queue[rear].i = i;
Queue[rear].j = j;
Queue[rear].pre = front;
mg[i][j] = -1;
}
}
}
if(!find)
printf("找不到路径!\n");
}
int main(void)
{
mgpath();
return 0;
}
分享到:
相关推荐
自己编写的 走迷宫-队列 cpp代码 交流 交流
7. 编程技巧:如何在C语言中实现递归或队列等抽象数据类型。 为了实现这样的程序,开发者需要具备扎实的C语言基础,理解数据结构与算法,以及基本的软件工程实践,如测试和调试。对于有兴趣深入研究的人来说,这个...
栈和队列的应用 - 求解迷宫问题 栈和队列都是存放多个数据的容器,通常用于存放临时数据。如果先放入的数据先处理,则使用队列。如果后放入的数据先处理,则使用栈。在本章节中,我们将介绍如何使用队列来解决迷宫...
在这个方法中,队列作为数据结构扮演着关键角色,帮助我们系统地探索迷宫的所有可能路径。 迷宫问题的基本设定是一个二维矩阵,其中每个单元格可以是可通行的(通常用0表示)或障碍物(用1表示)。起点(source)和...
除了基本的路径搜索,迷宫设计还可以扩展到其他高级主题,比如最短路径的A*算法,该算法结合了BFS的广度优先和优先队列的效率,以启发式函数指导搜索。此外,还可以涉及迷宫的生成,如Prim算法或Kruskal算法生成最小...
C++数据结构练习题,利用队列解决迷宫问题,完成出路的寻找
数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...
在这个特定的应用中,我们将讨论如何通过引入优先级队列优化回溯法,从而提高求解迷宫问题的效率。 首先,让我们深入理解回溯法。在解决迷宫问题时,通常使用二维数组表示迷宫,其中0表示可通过的路径,1表示障碍物...
《C++实现迷宫求解程序详解》 在编程领域,迷宫问题是一个经典而有趣的算法挑战,它涉及到了路径搜索、回溯等算法。本文将深入探讨如何使用C++来实现一个迷宫求解程序,同时也会介绍相关的核心概念和技术。 首先,...
3. **数据结构**:在实现这些算法时,我们需要使用一些基本的数据结构,如数组(表示迷宫)、栈和队列(用于存储待访问的节点)。在C语言中,可以使用结构体定义自定义数据类型,比如定义一个结构体来表示节点,包含...
"利用栈和队列实现迷宫" 通过栈和队列两种不同的方法来实现迷宫问题。队列方法求出的迷宫路径是最短路径。迷宫问题是指在一个迷宫中找到从起点到终点的路径。这里我们使用栈和队列两种数据结构来解决这个问题。 栈...
用队列实现迷宫求解 用队列实现迷宫 队列实现迷宫求解 队列求解迷宫 用队列实现迷宫求解 用队列实现迷宫 队列实现迷宫求解 队列求解迷宫
本主题探讨如何利用栈和队列解决“走迷宫”的问题。在这个问题中,我们通常将迷宫视为一个二维网格,其中每个节点代表一个位置,路径可能是允许移动的方向(上、下、左、右)。我们的目标是从起点找到一条到达终点的...
ACM、数据结构练习经典问题——队列求解迷宫问题。VC6.0调试通过。
栈和队列是两种最基本且重要的数据结构,本项目以"栈和队列迷宫"为主题,结合C++语言,提供了一个实际的应用场景来深入理解这两种数据结构。 栈(Stack)是一种后进先出(LIFO)的数据结构,它的操作类似于日常生活...
从给定的代码片段来看,这是一段使用C语言实现迷宫最短路径求解的程序,主要通过队列(Queue)与栈(Stack)的数据结构来完成算法的设计与实现。下面将对这段代码涉及的关键知识点进行详细解析。 ### C语言中的数据...
C语言 已在dev c上编译运行成功 数据结构作业 有充分的注释
在LeetCode的题目中,栈常用于解决回溯、递归问题,如迷宫求解、括号匹配等。 【面试必备】 在求职面试中,掌握基础算法和数据结构如链表、队列、栈是至关重要的。它们考察的是解决问题的能力,逻辑思维以及编码...