【转】算法基础(二):栈的应用 --- 迷宫解题

简介: 来源:https://software.intel.com/zh-cn/blogs/2014/03/03/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20others-%20suanfa 注:为了不离开本节讨论的重点--栈,迷宫的自动生成以后重新写。

来源:https://software.intel.com/zh-cn/blogs/2014/03/03/?utm_campaign=CSDN&utm_source=intel.csdn.net&utm_medium=Link&utm_content=%20others-%20suanfa

注:为了不离开本节讨论的重点--栈,迷宫的自动生成以后重新写。这里用简单的二维数组代替,手动迷宫,呵呵!

MAP里面0代表墙(通不过),1代表空格(可通过)代码中每一步有详细注释。欢迎大家交流,嘻嘻。

  1 // DataStructure_ZJC.cpp : 定义控制台应用程序的入口点。  
  2 /* 
  3 二. 栈的应用-迷宫解题 
  4 */  
  5 #include "stdafx.h"  
  6 #include<stdio.h>  
  7 #include<malloc.h>  
  8 #include<stdlib.h>  
  9   
 10 #define TRUE  1   
 11 #define FALSE 0  
 12 #define OK    1  
 13 #define ERROR 0  
 14 #define INFEASIBLE -1  
 15 #define OVERFLOW   -2  
 16   
 17 typedef struct  
 18 {  
 19     int x;          //x坐标  
 20     int y;          //y坐标  
 21 }Postype;           //坐标类型  
 22 typedef struct  
 23 {  
 24     //int ord;      //通道块在路径上的序号  
 25     //Postype seat; //通道块在迷宫中的坐标  
 26     //int di;       //从此通道块走向下一通道块的“方向”  
 27     int x;  
 28     int y;          //元素坐标  
 29   
 30 //  bool track;     //是否已经走过  
 31 }ElemType;          //栈的元素类型  
 32   
 33 int MAP[9][9] =     /*二维数组就够用了,先从简单的地图开始*/  
 34 {    
 35    //0 1 2 3 4 5 6 7 8  
 36        
 37      0,0,0,0,0,0,0,0,0,  
 38      0,1,0,0,1,1,1,1,0,  
 39      0,1,0,0,1,1,1,1,0,  
 40      0,1,1,1,1,0,1,1,0,  
 41      0,1,0,1,0,1,1,1,0,  
 42      0,1,0,1,0,1,1,1,0,  
 43      0,1,0,1,0,1,1,1,0,  
 44      0,0,0,1,1,1,1,1,0,  
 45      0,0,0,0,0,0,0,0,0,  
 46   
 47   
 48 };  
 49 /*-------------------------------------栈的元素类型定义完毕-------------------------*/  
 50 typedef int Status;     //函数返回值  
 51   
 52 #define STACK_INIT_SIZE 100     // 栈的初始大小  
 53 #define STACK_INCREMENT 10      // 每次增加的空间大小  
 54   
 55   
 56 //下面给出栈的相关定义  
 57 typedef struct  
 58 {  
 59     ElemType *base;     //在构造栈之前和销毁之后,base的值为NULL  
 60     ElemType *top;      //栈顶指针  
 61     int stacksize;      //当前已分配的存储空间,以元素为单位  
 62 }ZJC_Stack;  
 63   
 64 //--------------------------------------栈基本操作的算法部分--------------------------   
 65 //栈的初始化  
 66 Status InitStack(ZJC_Stack &S)    
 67 {  
 68        
 69     S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));    //分配内存空间  
 70     if(!S.base)            
 71         exit(OVERFLOW);  
 72       
 73     else                //否则分配成功  
 74     {  
 75         S.top = S.base;    
 76         S.stacksize  = STACK_INIT_SIZE;    
 77         return  OK;  
 78     }  
 79   
 80 }  
 81                         //获得栈顶元素  
 82 ElemType GetTop(ZJC_Stack S)  
 83 {      
 84     if(S.top == S.base )  
 85         exit(ERROR);       
 86     return *(S.top - 1);       
 87 }  
 88 //压栈  
 89 Status Push(ZJC_Stack &S,ElemType e)  
 90 {                      
 91     if(S.top - S.base >= S.stacksize)       
 92     {  
 93         S.base = (ElemType*)realloc(S.base,(S.stacksize + STACK_INCREMENT) * sizeof(ElemType));  
 94         if(!S.base)  
 95             exit(OVERFLOW);  
 96         S.stacksize += STACK_INCREMENT;        
 97         S.top = S.base + S.stacksize;         
 98     }  
 99     *S.top++ = e;  
100     return OK;  
101 }  
102 void Print_Path(ZJC_Stack S)    //打印出栈中的元素  
103 {  
104     printf("\n寻路完成..路径坐标值如下:......\n");  
105     ElemType *p = S.base;       //首先p指向栈底指针  
106     ElemType temp;     
107     while( p != S.top)          //只要没有到顶端,指针就移动,然后输出元素值  
108     {  
109         temp = *p;  
110         printf("\n路径 x = %d , y = %d",temp.x,temp.y);  
111         p++;          
112     }  
113 }  
114   
115 //出栈函数  
116 Status Pop(ZJC_Stack &S,ElemType &e)  
117 {  
118     if(S.top == S.base      )   //空栈,返回错误  
119     return ERROR;  
120     else                        //不是空栈  
121     {         
122         e = * --S.top;  
123         return OK;  
124     }  
125 }  
126 void PathAddToStack(int i,int j,ElemType temp,ZJC_Stack &robot)     //因为要修改值,所以取地址,开始没加取地址符号,栈顶元素一直是(1,1)  
127 {  
128     temp.x = i,temp.y = j;  
129     Push(robot,temp);  
130     MAP[i][j] = 2;                      //标记已经走过该格子了,当初想是否需要用其他标记,实际上不需要的,既然标记2,那么证明当然可以走过(不是墙)!  
131 }  
132 void MAZH_SOLVE(int endx,int endy)      //解决迷宫问题函数,参数为终点的坐标  
133 {                             
134     int i = 1,j = 1;                    //起点坐标    
135     ZJC_Stack robot;                    //定义栈;  
136     if(InitStack( robot ) )             //初始化栈  
137         printf("\n栈的初始化完成....\n");                                        
138     ElemType CurrentPos ;               //当前位置         
139     ElemType start;                     //初始位置的相关信息  
140     ElemType temp;                      //暂时用的  
141     start.x = i;  
142     start.y = j;  
143     temp = start;  
144     //start.track = true;               //Robot站在初始位置,初始位置已经走过  
145     MAP[i][j] = 2;                      //走过的标记为2             
146     Push(robot,start);                  //初始位置入栈  
147     printf("\n开始寻路....\n");   
148     do                                  //主要寻路算法:  
149     {  
150           
151           CurrentPos = GetTop(robot);  
152           i = CurrentPos.x;  
153           j = CurrentPos.y;  
154           printf(" \n寻路过程如下栈顶元素的 x = %d ,y = %d....\n",i,j);  
155           if(MAP[i][j+1] == 1)          //表明向下一格走得通  
156           {                                       
157               printf("\n向下能走动");    //向下前进一步,压栈,标记  
158               j++;  
159               PathAddToStack(i,j,temp,robot);                             
160           }  
161           else if( MAP[i + 1][j] == 1)         
162           {  
163                printf("\n向右能走动");  
164                 i++;                           
165                 PathAddToStack(i,j,temp,robot);  
166           }  
167           else  if(MAP[i - 1][j] == 1)          
168           {  
169                printf("\n向左能走动");  
170                 i--;                           
171                 PathAddToStack(i,j,temp,robot);  
172           }  
173           else if(MAP[i][j - 1] == 1)          
174           {  
175                printf("\n向上能走动");  
176                 j--;                           
177                 PathAddToStack(i,j,temp,robot);  
178           }  
179           else  //都走不动  
180           {  
181                printf("\n都走不动,退栈");                           
182                Pop(robot,temp);  
183           }  
184       
185     }while( GetTop(robot).x != endx || GetTop(robot).y != endy);        //只要栈顶元素的x,y不等于终点坐标的x,y,则一直循环找路径  
186     printf("\n完成!\n");  
187     Print_Path(robot);                  //打印出坐标值                               
188 }  
189 int _tmain(int argc, _TCHAR* argv[])    //入口函数  
190 {      
191     MAZH_SOLVE(7,7);       
192     return 0;  
193 }
View Code

其实在开始判断一下起点与终点的相对位置,选择不同的方案,这样可以减少后面的某些判断次数,提高效率。

比如我的这张地图中,就应该优先判断右下,因为终点在右下角。开始判断一下相对位置,后面修改下if条件句的顺序,就能提高效率了。

运行结果:

 

相关文章
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
193 65
WK
|
3天前
|
机器学习/深度学习 算法 数据挖掘
PSO算法的应用场景有哪些
粒子群优化算法(PSO)因其实现简单、高效灵活,在众多领域广泛应用。其主要场景包括:神经网络训练、工程设计、电力系统经济调度与配电网络重构、数据挖掘中的聚类与分类、控制工程中的参数整定、机器人路径规划、图像处理、生物信息学及物流配送和交通管理等。PSO能处理复杂优化问题,快速找到全局最优解或近似解,展现出强大的应用潜力。
WK
14 1
|
12天前
|
机器学习/深度学习 算法 Python
群智能算法:深入解读人工水母算法:原理、实现与应用
近年来,受自然界生物行为启发的优化算法备受关注。人工水母算法(AJSA)模拟水母在海洋中寻找食物的行为,是一种新颖的优化技术。本文详细解读其原理及实现步骤,并提供代码示例,帮助读者理解这一算法。在多模态、非线性优化问题中,AJSA表现出色,具有广泛应用前景。
|
19天前
|
机器学习/深度学习 算法 数据挖掘
R语言中的支持向量机(SVM)与K最近邻(KNN)算法实现与应用
【9月更文挑战第2天】无论是支持向量机还是K最近邻算法,都是机器学习中非常重要的分类算法。它们在R语言中的实现相对简单,但各有其优缺点和适用场景。在实际应用中,应根据数据的特性、任务的需求以及计算资源的限制来选择合适的算法。通过不断地实践和探索,我们可以更好地掌握这些算法并应用到实际的数据分析和机器学习任务中。
|
24天前
|
算法 C++
A : DS串应用–KMP算法
这篇文章提供了KMP算法的C++实现,包括计算模式串的next数组和在主串中查找模式串位置的函数,用于演示KMP算法的基本应用。
|
27天前
|
缓存 算法 前端开发
深入理解缓存淘汰策略:LRU和LFU算法的解析与应用
【8月更文挑战第25天】在计算机科学领域,高效管理资源对于提升系统性能至关重要。内存缓存作为一种加速数据读取的有效方法,其管理策略直接影响整体性能。本文重点介绍两种常用的缓存淘汰算法:LRU(最近最少使用)和LFU(最不经常使用)。LRU算法依据数据最近是否被访问来进行淘汰决策;而LFU算法则根据数据的访问频率做出判断。这两种算法各有特点,适用于不同的应用场景。通过深入分析这两种算法的原理、实现方式及适用场景,本文旨在帮助开发者更好地理解缓存管理机制,从而在实际应用中作出更合理的选择,有效提升系统性能和用户体验。
56 1
|
1月前
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
45 2
|
1月前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
40 2
|
1月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
21 0
|
1月前
|
机器学习/深度学习 数据采集 算法
随机森林算法应用
8月更文挑战第20天