`
Enria
  • 浏览: 11947 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
最近访客 更多访客>>
社区版块
存档分类
最新评论

迷宫-队列

 
阅读更多

求解迷宫路径时,使用的是循环队列,所以出队只是修改了方块在队列里的下标,并没有真正意义上的出队。

思路是:

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;
}
0
0
分享到:
评论

相关推荐

    自编 走迷宫-队列 cpp代码

    自己编写的 走迷宫-队列 cpp代码 交流 交流

    迷宫-----c语言编写

    7. 编程技巧:如何在C语言中实现递归或队列等抽象数据类型。 为了实现这样的程序,开发者需要具备扎实的C语言基础,理解数据结构与算法,以及基本的软件工程实践,如测试和调试。对于有兴趣深入研究的人来说,这个...

    第3章栈和队列第7讲-队列的应用-求解迷宫问题.pptx

    栈和队列的应用 - 求解迷宫问题 栈和队列都是存放多个数据的容器,通常用于存放临时数据。如果先放入的数据先处理,则使用队列。如果后放入的数据先处理,则使用栈。在本章节中,我们将介绍如何使用队列来解决迷宫...

    迷宫问题用队列解决

    在这个方法中,队列作为数据结构扮演着关键角色,帮助我们系统地探索迷宫的所有可能路径。 迷宫问题的基本设定是一个二维矩阵,其中每个单元格可以是可通行的(通常用0表示)或障碍物(用1表示)。起点(source)和...

    迷宫--数据结构课程设计

    除了基本的路径搜索,迷宫设计还可以扩展到其他高级主题,比如最短路径的A*算法,该算法结合了BFS的广度优先和优先队列的效率,以启发式函数指导搜索。此外,还可以涉及迷宫的生成,如Prim算法或Kruskal算法生成最小...

    利用队列实现迷宫问题

    C++数据结构练习题,利用队列解决迷宫问题,完成出路的寻找

    数据结构栈和队列解决迷宫问题

    数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...

    迷宫-回溯法改进(优先级算法)

    在这个特定的应用中,我们将讨论如何通过引入优先级队列优化回溯法,从而提高求解迷宫问题的效率。 首先,让我们深入理解回溯法。在解决迷宫问题时,通常使用二维数组表示迷宫,其中0表示可通过的路径,1表示障碍物...

    迷宫-C++版

    《C++实现迷宫求解程序详解》 在编程领域,迷宫问题是一个经典而有趣的算法挑战,它涉及到了路径搜索、回溯等算法。本文将深入探讨如何使用C++来实现一个迷宫求解程序,同时也会介绍相关的核心概念和技术。 首先,...

    C语言迷宫-老鼠吃奶酪源码

    3. **数据结构**:在实现这些算法时,我们需要使用一些基本的数据结构,如数组(表示迷宫)、栈和队列(用于存储待访问的节点)。在C语言中,可以使用结构体定义自定义数据类型,比如定义一个结构体来表示节点,包含...

    利用栈和队列实现迷宫

    "利用栈和队列实现迷宫" 通过栈和队列两种不同的方法来实现迷宫问题。队列方法求出的迷宫路径是最短路径。迷宫问题是指在一个迷宫中找到从起点到终点的路径。这里我们使用栈和队列两种数据结构来解决这个问题。 栈...

    【数据结构】用队列实现迷宫求解

    用队列实现迷宫求解 用队列实现迷宫 队列实现迷宫求解 队列求解迷宫 用队列实现迷宫求解 用队列实现迷宫 队列实现迷宫求解 队列求解迷宫

    分别用栈和队列实现迷宫

    本主题探讨如何利用栈和队列解决“走迷宫”的问题。在这个问题中,我们通常将迷宫视为一个二维网格,其中每个节点代表一个位置,路径可能是允许移动的方向(上、下、左、右)。我们的目标是从起点找到一条到达终点的...

    队列求解迷宫问题

    ACM、数据结构练习经典问题——队列求解迷宫问题。VC6.0调试通过。

    栈和队列迷宫

    栈和队列是两种最基本且重要的数据结构,本项目以"栈和队列迷宫"为主题,结合C++语言,提供了一个实际的应用场景来深入理解这两种数据结构。 栈(Stack)是一种后进先出(LIFO)的数据结构,它的操作类似于日常生活...

    C语言数据结构用队列求解迷宫最短路径

    从给定的代码片段来看,这是一段使用C语言实现迷宫最短路径求解的程序,主要通过队列(Queue)与栈(Stack)的数据结构来完成算法的设计与实现。下面将对这段代码涉及的关键知识点进行详细解析。 ### C语言中的数据...

    迷宫 用队列实现

    C语言 已在dev c上编译运行成功 数据结构作业 有充分的注释

    基础算法+链表-队列-栈+面试必备+思维训练+编码能力训练

    在LeetCode的题目中,栈常用于解决回溯、递归问题,如迷宫求解、括号匹配等。 【面试必备】 在求职面试中,掌握基础算法和数据结构如链表、队列、栈是至关重要的。它们考察的是解决问题的能力,逻辑思维以及编码...

Global site tag (gtag.js) - Google Analytics