【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题

这篇具有很好参考价值的文章主要介绍了【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

以下算法均是原创,未参考任何资料!请勿抄袭!欢迎交流。

亲测可行:

使用蓝桥杯比赛编译器:DEV C++ 

【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题


求迷宫中从入口到出口的路径是一个经典的程序设计问题,通常采用“穷举求解”的方法,即顺着某一方向向前探索,若能走通,则继续往前走;否则原路返回,换一个方向继续探索,直至所有可能的通路都探索到为止。

因此,在求解迷宫问题的时候应用“”也就是自然而然的事了。

对于程序来说:

1.我们需要规定一个方向作为主方向,使得“自己”的位置不断移动,直到“遇到走不通的地方”或者是“遇到之前走过的地方”。

方向定义:

东:1

南:2

西:3

北:4

【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题

2.我们需要直到我们经过哪些地方,在这里我们将除栈顶外的其他元素视为“经过的地方”!!!

3.我们需要一个二维数组存放“迷宫”,还需要一个二维数组存放“走过的地方”。

迷宫:【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题

 走过的地方:(这里把所有地点初始化为0,代表尚未经过,经过的地方会被重新赋值为1)

【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题

 4.最后,当我们“走”到终点的时候,路径的每一个“点”都会存放到“栈”中,我们将其依次弹出即可得到最终路径。【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题

 过程截图:

【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题

【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题 


栈:

顺序栈,栈中每一个结构体对应一个点,x表示该点的横坐标,y表示该点的纵坐标,direction表示该点的方向。

代码实现: 

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

//定义迷宫 
int arr[MAXSIZE][MAXSIZE] = {
	1,1,1,1,1,1,1,1,1,1,
	1,0,0,1,1,1,1,1,1,1,
	1,1,0,1,0,0,0,0,1,1,
	1,1,0,1,0,1,1,0,1,1,
	1,1,0,0,0,1,1,0,1,1,
	1,1,0,1,0,1,1,0,1,1,
	1,1,0,1,0,1,1,0,1,1,
	1,1,0,1,0,1,1,0,1,1,
	1,1,0,0,0,0,1,0,2,1,
	1,1,1,1,1,1,1,1,1,1
};

//行走过的标志
int arr_tar[MAXSIZE][MAXSIZE] = {0};
 
//栈的数据域 
typedef struct Stack
{
	int x;
	int y;
	int direction;
}Stack;

//顺序栈 
typedef struct SqStack
{
	Stack* base;
	int top;
}SqStack;

//初始化
void InitStack(SqStack* stack)
{
	stack->base = (Stack*)malloc(MAXSIZE * MAXSIZE * sizeof(Stack));
	stack->top = 0;
}
 
//入栈
void InsertStack(SqStack* stack, Stack data)
{
	stack->base[stack->top] = data;
	stack->top++;
	
	printf("arr[%d][%d]成功入栈!\n", data.x, data.y);
} 

//出栈 
Stack PopStack(SqStack* stack)
{
	stack->top--;
	
	printf("arr[%d][%d]成功出栈!\n", stack->base[stack->top].x, stack->base[stack->top].y);
	return stack->base[stack->top];
}

//判栈空
int StackEmpty(SqStack* stack)
{
	if (stack->top == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
 
//取栈顶元素
Stack GetTop(SqStack* stack)
{
	int q = stack->top - 1;
	
	return stack->base[q];
}
 
//判断该位置是否为墙和之前是否经过 
int CanPass(Stack data)
{
	if (arr[data.x][data.y] == 1 || arr_tar[data.x][data.y] == 1)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
 
//判断该位置是否为出口 
int IsEnd(Stack data)
{
	if (arr[data.x][data.y] == 2) 
	{
		printf("发现出口!!!\n"); 
		return 1;
	}
	else
	{
		return 0;
	}
}

//移动
void move(SqStack* stack)
{
	Stack data = GetTop(stack);
	Stack new_data;
	
	if (data.direction == 1)//东 
	{
		printf("向东走了一格\n");
		new_data.direction = 1;
		new_data.x = data.x;
		new_data.y = data.y + 1;
	}
	else if (data.direction == 2)//南 
	{
		printf("向南走了一格\n");
		new_data.direction = 1;
		new_data.x = data.x + 1;
		new_data.y = data.y;
	}
	else if (data.direction == 3)//西 
	{
		printf("向西走了一格\n");
		new_data.direction = 1;
		new_data.x = data.x;
		new_data.y = data.y - 1;
	}
	else if (data.direction == 4)//北 
	{
		printf("向北走了一格\n");
		new_data.direction = 1;
		new_data.x = data.x - 1;
		new_data.y = data.y;
	}

	InsertStack(stack, new_data);
} 

//更新走过的路径
void AddPath(Stack data)
{
	arr_tar[data.x][data.y] = 1;
}
void PopPath(Stack data)
{
	arr_tar[data.x][data.y] = 0;
}
 
int main()
{
	SqStack* stack = (SqStack*)malloc(sizeof(SqStack));
	//遍历迷宫 
	int i, j;
	for (i = 0;i < MAXSIZE; i++)
	{
		for (j = 0;j < MAXSIZE; j++)
		{
			printf("%d\t", arr[i][j]);
		}
		printf("\n");
	}
	
		
	printf("--------------------破译中--------------------\n");
	
	//初始化
	InitStack(stack);
	//设置初始点 
	int x = 1, y = 1;
	Stack data = {x, y, 1};
	InsertStack(stack, data);

	do
	{
		if(!CanPass(GetTop(stack)))//不是墙并且从未走过 
		{
			if (IsEnd(GetTop(stack)))//检测出口 
			{
				break;
			}
			else
			{
				AddPath(GetTop(stack));
				move(stack);//添加下一个块到栈中	
			} 
		}
		else//是墙 
		{
 			PopStack(stack);
 			PopPath(GetTop(stack));//栈顶元素的路径不算入经过地点 
 			
 			if (!StackEmpty(stack))
 			{
 				if (GetTop(stack).direction == 4 && !StackEmpty(stack))
 				{
 					AddPath(GetTop(stack));
 					PopStack(stack);
 					PopPath(GetTop(stack));
				}
				if (GetTop(stack).direction < 4)
				{
					//更新栈顶坐标的方向
					stack->base[stack->top - 1].direction++;		
				}
			}
		} 
		//getchar();
	}while(!StackEmpty(stack));
	
	printf("--------------------破译完毕--------------------\n");
	//输出结果
	while (!StackEmpty(stack))
	{
		data = PopStack(stack);
		arr[data.x][data.y] = 3;
	} 
	//遍历迷宫 
	for (i = 0;i < MAXSIZE; i++)
	{
		for (j = 0;j < MAXSIZE; j++)
		{
			printf("%d\t", arr[i][j]);
		}
		printf("\n");
	}
	 
	return 0;
} 

欢迎大家留言交流

结语:这不仅仅是一个算法,你把他加点功能(增删改查),他就变成了期末的课程设计。

【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题文章来源地址https://www.toymoban.com/news/detail-473130.html

到了这里,关于【数据结构 迷宫问题求解】栈的应用|c语言|迷宫问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C数据结构】迷宫问题

    前言: 本章记录作者学习中,遇到的两个比较有趣的问题,一个简单和一个较复杂的迷宫问题。     让我们先来看简单的:迷宫问题 它的具体要求: 输入描述: 输入两个整数,分别表示二维数组的行数,列数。再输入相应的数组,其中的 1表示墙壁 , 0表示可以走的路 。

    2024年02月02日
    浏览(31)
  • 【数据结构】迷宫问题实现(包含界面)

    🎈🎈 问题描述:假设迷宫由m行n列构成,有一个入口和一个出口,入口坐标为(1,1),出口坐标为(m,n),试设计并验证一下算法:找出一条入口通往出口的路径,或报告一个\\\"无法通过\\\"的信息。 具体需求如下: 用C语言实现顺序存储结构上队列的基本操作,然后利用该队列的基本操

    2024年02月04日
    浏览(29)
  • 数据结构——迷宫问题(顺序栈、C++)

     讲解: 一、采用二维数组和srand函数随机生成只有0和1的迷宫。 二、求解迷宫大概思路:先将入口处的坐标即方向d入栈,然后当栈不为空时,取出栈顶(即当前节点)的数据。遍历当前节点的四个方向,找到可行的下一个节点,并将其入栈;如没有可行的下一个节点,则将

    2024年02月13日
    浏览(23)
  • 《数据结构与算法分析》课程设计——迷宫问题

    中国矿业大学信控学院   补一下我之前在博客园发布的内容  懒得调了, 想复制完整代码直接复制最下面的 ,想复制分布代码去看我博客园链接吧 《数据结构与算法分析》课程设计——迷宫问题 - 刷子zz - 博客园 一、  问题描述 问题中迷宫可用方阵[m,n]表示,0表示能通过

    2024年02月10日
    浏览(37)
  • 【数据结构-字符串 三】【栈的应用】字符串解码

    废话不多说,喊一句号子鼓励自己:程序员永不失业,程序员走向架构!本篇Blog的主题是【字符串转换】,使用【字符串】这个基本的数据结构来实现,这个高频题的站点是: CodeTop ,筛选条件为: 目标公司+最近一年+出现频率排序 ,由高到低的去 牛客TOP101 去找,只有两个

    2024年02月07日
    浏览(66)
  • 【数据结构】迷宫问题DFS非递归(c语言实现)

    本来之前写过一个推箱子,就想着写个迷宫游戏,因为想着推箱子游戏里面也有墙,也有玩家的移动,比推箱子简单的是还不用判断前面是否有箱子的情况,但是自己写的迷宫游戏如果自己随机生成的迷宫地图的话,不一定会有通路,他要学一个什么随机迷宫的生成,刚看完

    2024年02月08日
    浏览(28)
  • C数据结构与算法——队列 应用(C语言纯享版 迷宫)

    实验任务 (1) 掌握顺序循环队列及其C语言的表示; (2) 掌握入队、出队等基本算法的实现; (3) 掌握顺序循环队列的基本应用(求解迷宫通路)。 实验内容 使用C语言实现顺序循环队列的类型定义与算法函数; 编写main()函数并根据需要修改、补充相关的类型定义与函数,以实

    2024年02月15日
    浏览(34)
  • 数据结构与算法-(7)---栈的应用-(4)后缀表达式求值

    🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:Aileen_0v0🧸—CSDN博客 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:Aileen_0v0🧸

    2024年02月07日
    浏览(39)
  • 【数据结构】栈的使用|模拟实现|应用|栈与虚拟机栈和栈帧的区别

    目录 一、栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分

    2024年02月04日
    浏览(36)
  • 数据结构:链表带环问题的求解

    个人主页 :个人主页 个人专栏 :《数据结构》《C语言》 思路 我们定义两个变量,slow和fast,慢指针slow一次走一步,快指针fast一次走两步,则如果链表带环,slow和fast一定在环中相遇。思路很简单,但是为什么??? 解释1 当slow刚进入环部分,fast与slow相距N个节点时。 s

    2024年02月14日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包