c语言迷宫问题求解——递归、栈回溯

迷宫问题 C语言实现 若当前位置“可通“,则纳入”当前路径”,并继续朝“下一个位置探索”,即切换“下一位置”为“当前位置”,如此重复直至到达出口;若当前位置“不可通”则应顺着“来向”退回到“前一通道块”,然后朝着除“来向”之外的其他方向继续探索;若该通道块的四周4个方块均“不可通”,则应从“当前路径”上删除该通道块。假设以栈S记录“当前路径”,则栈顶中存放的是“当前路径上最后一个通道块”。在迷宫的某一位置的下一个位置可能在其的几个方向上(最多四个)如果迷宫中存在入口到出口的通道,求的一条放入栈S中。将不能通过的位置设置为-1。 阅读详情

第一次写,见谅


以下是求迷宫的实现

为什么下面会出现<span>标签啊,有什么简便的方法去掉吗?求告知

最后是关于求所有通路,个人愚笨只想到改变搜索方向顺序这种笨方法,总共有16种哭不同顺序,有兴趣的小伙伴可以试一下

/*
第一部分使用递归求解
为了数据的简单化,不对路口进行数据结构化,将用一个简单的int类型数组来表示迷宫
因为每一个路口的四个方向相对于当前路口的位移都是一样的,这样可以用一个int类型二位数据表示四个方向的相对于当前位置的位移,以顺时针东、南,、西、北储存
    
 */


//路口数据结构化
//当前路口状态;1表示通顺路口,2表示搜索过的,0表示障碍路口



#include<stdio.h>
#include<stdlib.h>
#define MaxStackSize 72   //堆栈的最大元素个数
#define m 9   //表示迷宫的行
#define n 8	   //表示迷宫的列


	//初始化迷宫,用于递归求通路
int maze[m][n]={
	{1,1,0,1,1,1,0,1},
	{1,1,0,1,1,1,0,1},
	{1,1,1,1,0,0,1,0},
	{1,0,0,0,1,1,0,1},
	{1,1,1,0,1,1,1,1},
	{1,0,1,1,1,0,1,0},
	{1,0,0,0,0,1,1,0},
	{0,0,1,1,1,0,1,0},
	{0,0,1,1,1,1,1,1}
};
//用于堆栈求通路
int mazee[m][n]={
	{1,1,0,1,1,1,0,1},
	{1,1,0,1,1,1,0,1},
	{1,1,1,1,0,0,1,0},
	{1,0,0,0,1,1,0,1},
	{1,1,1,0,1,1,1,1},
	{1,0,1,1,1,0,1,0},
	{1,0,0,0,0,1,1,0},
	{0,0,1,1,1,0,1,0},
	{0,0,1,1,1,1,1,1}
};


//初始化每个路口相邻路口的相对偏移量数组,表示当前路口的四个方向,按顺时针依次是东,南、西、北
int move[4][2]= {{0,1},{1,0},{0,-1},{-1,0}};


//求迷宫通路算法,两个参数为入口坐标
int MAZE(int x, int y)
{




	//将越界路口跳出
	if(x<0||x>m||y<0||y>n){
		return 0;
	}
    int a,b;
    int tag = 0;
	//迷宫出口
    if(x==8 && y==7)
        return 1;
	
	//试探相邻的4个路口
    for(int i= 0; i<4; i++)
    {
        a= x+ move[i][0];
        b= y+ move[i][1];


		//如果路口通顺且没搜索过则进入该路口,否则什么都不做
        if(maze[a][b]==1)
        {
		      	
            maze[a][b]= 2;//(a,b)上的值改成2表示走过的路
			//进入路口
			tag= MAZE(a, b);
            //判断是否找到出口用于输出路径
			if(tag){
				
                printf("(%d,%d)←",a,b);
                return 1;
            }
        }
    }//end for
    return 0;
}


/*


第二部分使用堆栈求迷宫通路


*/

//路口数据化
typedef struct{
	int x;
	int y;      //x,y表示路口位置
	int condition;       //表示路口状态,1表示通顺路口,2表示搜索过的,0表示障碍路口
} Stack;

//栈用来储存从入口到当前路口的路径
typedef struct
{
	Stack stack[MaxStackSize];
	int top;
}SeqStack;


//堆栈初始化
void StackInitiate(SeqStack *s){
	s->top=0;
}


//判断堆栈是否为空
int StackNotEmpty(SeqStack s){
	if(s.top<=0)return 0;
	else return 1;
}


//入栈,成功返回1,否则返回0
int StackPush(SeqStack *s,Stack x){
	if(s->top>=MaxStackSize)
	{
		printf("堆栈已满无法插入!\n");
		return 0;
	}
	else
	{
		s->stack[s->top]=x;
		s->top++;
		return 1;
	}
}


//取得栈顶元素,成功返回1,否则返回0
	int StackTop(SeqStack s,Stack *x)
	{
		if(s.top<=0)
		{
			printf("堆栈已空!\n");
			return 0;
		}
		else{
			*x=s.stack[s.top-1];
			return 1;
		}
	}


//出栈,成功返回1,否则返回0
int StackPop(SeqStack *s,Stack *x){


	if(s->top<=0)
	{
		printf("堆栈已空无数据元素出栈!\n");
		return 0;
	}
	else
	{
		s->top--;
		*x=s->stack[s->top];
		return 1;
	}
}


void getPass(){

SeqStack s;     //堆栈
StackInitiate(&s);         //堆栈初始化
Stack ss;
int a=0,b=0;       //a,b表示当前搜索的迷宫位置,当前是入口

ss.x=a;
ss.y=b;
ss.condition=mazee[a][b]=2;
StackPush(&s,ss);

while(StackNotEmpty(s)){       //将堆栈为空设置成停止循环的条件,也意味着没有通路;

StackTop(s,&ss);  //获取当前位置
	 
//下个路口的探索
for(int i= 0; i<4; i++)
  {

       a= ss.x+ move[i][0];
       b= ss.y+ move[i][1];
//如果不越界,进入下一个方向
if(a>=0&&a<m&&b>=0&&b<n){

//如果通顺,进入路口,入栈,否则什么都不做,搜索另一个方向
if(mazee[a][b]==1){
mazee[a][b]=2;
ss.condition=mazee[a][b];
ss.x=a;
ss.y=b;
StackPush(&s,ss);
break;

 }//end if
}//end if
if(i==3){
StackPop(&s,&ss);      //但搜索到第四个方向且该方向的路口不通,出栈
}
}//end for

//迷宫出口
if(a==8&&b==7)break;     //但搜索到出口跳出
 }//end while


if(!StackNotEmpty(s))printf("该迷宫没有通路\n");
else{
while(StackNotEmpty(s)){
    StackPop(&s,&ss);
printf("(%d,%d)←",ss.x,ss.y);
}//end while
}//end else
}




void main()
{


//堆栈求迷宫通路
printf("堆栈求迷宫的通路:\n");
getPass();
printf("\n\n\n\n");
//递归求所有通路,按一定方向顺序进行搜索能得到一条路径,反过来想的话,用不同方向顺序进行搜索能得到不同路径,除非只有一条通路
//调用MAZE,每调用依次必须对迷宫进行初始化
printf("递归求迷宫的通路:\n");
MAZE(0,0);
//迷宫入口
printf("(0,0)←入口\n");

system("pause");
       
用C语言手把手教你找出迷宫所有路径(附完整回溯算法代码) 本文详细介绍了如何使用C语言实现回溯算法解决迷宫问题,找出所有可能的路径。通过完整的代码示例和逐行解析,特别强调了回溯算法中的'标记与恢复现场'关键操作,帮助读者深入理解递归与回溯思想。文章还提供了常见问题调试技巧和算法优化思路,是学习算法实践的绝佳教程。 阅读详情

相关推荐

迷宫问题——栈实现(C语言)(数据结构与算法)

本文用栈解决迷宫问题,采用C语言实现,包括问题介绍、算法简介、求解过程、代码实现、结果展示。并附有完整代码。

qq_46490027的博客 2万+

C语言实现迷宫求解问题(详细思路+附源代码)

二、数据结构 1) 建立一个二维数组表示迷宫的路径(0表示通道,1表示墙壁); 2) 创建一个栈,用来存储“当前路径”,即“在搜索过程中某一时刻所在图中某个方块位置”。 1) 创建一个Int类型的二维数组intmaze[n1][n2],用来存放0和1 ; 2) 创建一个结构体用来储存数组信息(数组的横坐标X,数组的纵坐标Y,方向C) typedef struct node

好儿郎~志在四方 11万+

深入探索迷宫求解算法:C语言实现

在计算机科学中,迷宫求解问题是一个经典的搜索问题,具有丰富的理论和实际应用价值。简单来说,迷宫求解要求算法找到一条从起点到终点的路径,同时可能需要满足特定的条件,如最短路径、最少转弯等。迷宫问题可以按不同的标准进行分类。例如,根据迷宫的结构,可以分为静态迷宫和动态迷宫;按照求解目标,可以分为找到路径的普通迷宫、找到最短路径的最优迷宫,等等。不同的分类方式对应着不同的求解方法和策略。在现实世界中,迷宫求解问题的应用广泛,如机器人导航、网络路由优化、医疗影像分析等。

weixin_36173034的博客 1118

C语言求解迷宫问题(顺序栈)

本文主要锻炼栈的相关操作 ,并使用完成迷宫求解问题。

墨城烟柳ベ旧人殇的博客 3770

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

Mac上VMware Fusion手动安装VMware Tools实现跨系统复制粘贴

本文详细指导了在Mac的VMware Fusion中手动安装VMware Tools的完整流程,以解决虚拟机与宿主机之间无法复制粘贴的常见问题。通过定位安装镜像、挂载、解压并运行安装脚本,最终实现跨系统无缝数据交换,提升工作效率。

orange的博客 697

40、迷宫求解----递归实现

一、问题的分析: 本问题的求解,关键是如何找到求解任意两个点间,按照以上基本思想而走出的路线。按照这个路线,我们可以通过图形函数来动态的显示迷宫的搜索过程。 计算机解迷宫解通常用的是“穷举求解”方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进,否则沿着原路退回,换一个方向继续探索,直至出后位置,求得一条通路。假如所有可能的通路都探索到位能到达出口,则所设定的迷宫没有通路...

hopegrace的博客 1539

RC滤波电路实战解析:无源与有源设计的性能对比与应用选择

本文深入解析了RC滤波电路的核心原理,重点对比了无源滤波电路与有源滤波电路的性能差异。文章通过实测波形与仿真数据,详细阐述了两者在带载能力、频率响应精度、噪声特性等方面的优劣,并提供了清晰的应用选择指南,帮助工程师根据信号属性、负载条件和性能要求做出最优设计决策。

weixin_29268637的博客 429

迷宫求解(包含随机迷宫、求解动画演示)——C语言 数据结构

迷宫求解(包含随机迷宫、求解动画演示)——C语言 数据结构。该程序是一项 “迷宫求解” 类问题,主要功能包含: ①25 X 25迷宫的随机生成《随机迷宫》 ②迷宫求解的动画演示(DFS)《动画演示》 完整代码附最后 : )

m0_62038333的博客 6705

硬件工程师笔记——运算放大电路Multisim电路仿真实验汇总

本文系统介绍了运算放大电路的基础知识及其应用。主要内容包括:1)运算放大器的基本结构、理想特性及分析方法(虚短、虚断、叠加定理);2)比例运算电路(同向、反向、差分)的工作原理与仿真分析;3)求和运算、加减运算电路的实现方法;4)积分、微分、指数和对数运算电路的基本原理;5)过零电压比较器的功能特点。通过理论分析和仿真实验,详细阐述了各类运算放大电路的输入输出特性、相位关系和增益计算,为硬件工程师提供了实用的电路设计参考。

XU157303764的博客 2477

ESP32设备驱动-MLX90393磁场传感器驱动

MLX90393 磁场传感器可以在运行时重新编程为不同的模式和不同的设置。 该传感器使用 Melexis 专有的 Triaxis® 技术提供与沿 XYZ 轴感应的磁通密度成比例的 16 位输出,还提供温度输出信号。 这些数字值可通过 I2C 和 SPI 获得,其中 MLX90393 是总线上的从设备。

视觉与物联智能 2350

迷宫问题的递归回溯算法c语言,c语言迷宫问题求解——递归、栈回溯

第一次写,见谅以下是求迷宫的实现为什么下面会出现标签啊,有什么简便的方法去掉吗?求告知最后是关于求所有通路,个人愚笨只想到改变搜索方向顺序这种笨方法,总共有16种不同顺序,有兴趣的小伙伴可以试一下/*第一部分使用递归求解为了数据的简单化,不对路口进行数据结构化,将用一个简单的int类型数组来表示迷宫因为每一个路口的四个方向相对于当前路口的位移都是一样的,这样可以用一个int类型二位数据表示四个方向...

weixin_36345268的博客 2186

基于SVD矩阵分解的用户购物篮预测分析实战

基于SVD矩阵分解的用户购物篮预测分析实战

360

迷宫问题

#include #define MAXSIZE 100 #define M 10 #define N 10 struct  {  int i; //当前方块的行号  int j;//当前方块的列号  int di;//下一个可走的方位的方位号 }st[MAXSIZE]; int top=-1; //初始化栈指针 void mgpath(int mg[10][10]) {

dumanyi007的专栏 1085

Zemax与Matlab交互:双胶合优化详细流程

Zemax与Matlab交互:双胶合优化详细流程

weixin_72050316的博客 629

[STC32G144K246入门第六步]DAC驱动

本文摘要介绍了STC32G144微控制器内置的12位DAC模块特性与应用。该芯片集成双通道独立DAC,需通过内部运放缓冲后从P0.7/P5.0引脚输出,支持音频处理、波形生成等应用场景。重点阐述了DAC的R-2R梯形网络工作原理、关键性能指标(12位分辨率、转换速度等)及编程配置方法,包括频率设置、寄存器操作和运放引脚配置。文中还提供了32点正弦波表示例和初始化代码,强调参考电压稳定性对输出精度的重要影响。

sinat_58149788的博客 139

用C++写一个小程序,要求写出完整的代码,设计程序解决迷宫问题,该程序使用两个栈,一个栈用来初始化迷宫问题, 另一个用来实现回溯.在用户输入迷宫,一次输入一行.用户输入的迷宫包括任意个行和任意个列.按...

这是一个使用 C 语言解决迷宫问题的完整代码示例: ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_ROWS 50 // 迷宫最大行数 #define MAX_COLS 50 // 迷宫最大列数 // 坐标结构体 typedef struct Coordi...

weixin_35755188的博客 111

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

c语言迷宫问题课程报告,基于c语言的迷宫问题课程设计

基于c语言的迷宫问题课程设计 *******************实践教学*******************兰州理工大学软件学院2012 年春季学期算法与数据结构 课程设计题 目: 迷宫问题 专业班级: 姓 名: 学 号: 指导教师: 成 绩:_______________摘要在现实生活中,会遇到很多很多关于迷宫这样很复杂、很难解决的问题的问题。如果人工去解决这些问题,会很麻烦,花很长的时间...

weixin_39647180的博客 746

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

C程序设计的抽象思维-回溯算法-迷宫问题

【迷宫问题】 【算法1---堆栈回溯】 计算机解迷宫时,通常用的是"试探和回溯"的方法,即从入口出发,顺某一方向向前探索,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续探索,直至所有可能的通路都探索到为止,如果所有可能的通路都试探过,还是不能走到终点,那就说明该迷宫不存在从起点到终点的通道。   1.从入口进入迷宫之后,不管在迷宫的哪一个位置上,都是先往东走,如果走得通

jjjcainiao的专栏 1889

数据结构(c语言)——简单迷宫

对于一个用空格和‘#’号组成的迷宫,如果碰到‘#’,就不往那个方向走,

elias2333的博客 995

迷宫C描述——栈的举例

#include<stdio.h>#include<stdlib.h>#include<malloc.h>#defineMAXSIZE50#defineERROR-1#defineOK0#defineFALSE0#defineTRUE1typedefenum{RIGHT,DOWN,LEFT,UP}Direction;typ...

weixin_30663471的博客 85

迷宫问题C语言实现

#include //#define DEBUG 1 #include "../lib/debug.h" #define OK            (0) #define NOK          (-1) #define MAZE_SIZE 4 enum Tagderection {     RIGHT = 0,     DOWN,

leo72310的专栏 1239

用栈解决迷宫问题

#include #include #define m 6 #define n 8 #define MAXSIZE 100 typedef struct { int x,y,d;//d代表(x,y)下一步所走的方向 } DataType; typedef struct  { DataType data[MAXSIZE]; int top; }SeqStack,*PSeq

sinat_28911519的博客 585

第六周--数据结构之自建算法库之迷宫问题(用栈结构)

/*   *数据结构--迷宫问题(用栈结构)   *Copyright (c) 2015 烟台大学计算机与控制工程学院   *All right reserved.   *文件名称:list.cpp   *标题:迷宫问题(用栈结构)   *分类:队列   *writer:罗海员   *date:2015年10月18日   *版本:V1.0.1   *操作系统:windows8

Sailor_luo的博客 537

数据结构迷宫源程序

#include #include #include #define M 100 #define TRUE 1 #define FALSE 0 #define OVERFLOW 0 #define OK 1 #define ERROR 0 int a[10][10] = {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},                  {1,

暗透了更能看到星光 771
下一篇: 一个简单的todolist,记录我的前端第一步
黄金贼贼
博客等级 码龄8年 43粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值