栈实现迷宫求解(c++版)

相信大家都应该听过栈吧,一直想利用栈来实现一个算法,最近有点空,就利用栈的先进后出的特性来完成迷宫求的问题,下面将详细介绍栈的实现和迷宫求解的过程,可以很好的学习栈的使用。

栈有两种实现方法,一种是顺序,即数组形式,一种是线性,即链表形式,个人还是比较喜欢链表形式实现栈的基本功能。

首先弄一个简单的迷宫,如图:

我们很容易看出这个迷宫解的路径,那怎么让计算机帮我们求解出来呢。

首先我们要对迷宫数据化,很容易想到二维数组来表示,0表示通路,1表示障碍,即表示为:

int map[4][4]={
        {0,1,1,0},
        {0,0,0,0},
        {0,0,1,1},
        {1,0,0,0}
    };

我们的思路是,从入口出发,顺着探索方向向前探索,如能走通,则继续往前走;否则,沿原路退回,换一个方向进行探索,直至试探出口为止。看到这个思路,发现使用栈是多么的合适。下面我们就来实现迷宫解答。

一.栈的实现

我们首先要会实现栈的出栈入栈等基本栈的构建

定义栈的结构:

struct node
{
    int x;//行
    int y;//列  对应map[x][y]
    int direction;//1代表向右,2代表向下,3代表向左,4代表向上,存放探索方向,下一次探索的方向
    node *next;
    int above;//上一块是哪个方向探索下来的,防止左右上下死循环
    node()
    {
        next=NULL;
    }
};

定义栈的头指针:node *head=NULL;

数据入栈函数:

//进栈---插入到head之后
void Push(node * &head,int x,int y,int direction,int above)
{
     node * temp=new node;
     temp->x=x;temp->y=y;temp->direction=direction;
     temp->above=above;
     if(head==NULL)
         head=temp;
     else
     {
         temp->next=head;
         head=temp;
     }
}

数据出栈实现:

//出栈--取head后
void Pop(node * &head)
{
    node * ok;
    if(head!=NULL)
    {
        ok=head;
        head=head->next;
        delete ok;
    }
}

上面就实现了栈的基本功能。下面我们就可以开始对迷宫进行求解了。求实,理解了原理,代码编写就不是难事了。

迷宫求解步骤如下:

首先把入口进栈:Push(head,0,0,1,0);//入口进栈

具体探索代码:
//探索路径
    while(true)
    {
       if(Getpop(head).x==3&&Getpop(head).y==3)//找到出口,停止循环
            break;
        //对下一块进行探测
        bool sea=true;
        node  temp;
        //每一步路径探索
        while(sea)
        {
            temp=Getpop(head);
            //temp.above!=4条件防止左右或上下循环走
            //temp.direction为前进方向
            switch (temp.direction)
            {
            case 1:
                //探索成功,即向右可以,且上一步来的方向不是左,防止左右死循环,探索成功,方向加一,便于下次回溯换一个方向探索
                if((temp.y+1)<BLOCKNUM&&map[temp.x][temp.y+1]==0&&temp.above!=3)
                {
                    Change(head,temp.direction+1);
                    Push(head,temp.x,temp.y+1,1,1);//探索成功进栈
                    sea=false; //停止循环
                }
                else
                {
                    Change(head,temp.direction+1);        //向右探索失败,探索方向加一,继续探索
                }
                break;
            case 2:
                if((temp.x+1)<BLOCKNUM&&map[temp.x+1][temp.y]==0&&temp.above!=4)
                {
                    Change(head,temp.direction+1);
                    Push(head,temp.x+1,temp.y,1,2);
                    sea=false;
                }
                else
               {
                    Change(head,temp.direction+1);
                }
                break;
            case 3:
               if((temp.y-1)>=0&&map[temp.x][temp.y-1]==0&&temp.above!=1)
                {
                    Change(head,temp.direction+1);
                    Push(head,temp.x,temp.y-1,1,3);
                    sea=false;
                }
                else
                {
                    Change(head,temp.direction+1);
                }
                break;
           case 4:
                if((temp.x-1)>=0&&map[temp.x-1][temp.y]==0&&temp.above!=2)
                {
                    Change(head,temp.direction+1);
                    Push(head,temp.x-1,temp.y,1,4);
                    sea=false;
                }
                else
                {
                    Pop(head);
                    sea=false;
                }
                break;
            default://即当temp.direction==5,此方块已经把所有方向都探索完了,把他出栈
                Pop(head);
                sea=false;
                break;
            }
        }
    }

通过上面两个while循环即可实现了迷宫求解。

时间: 2024-10-14 07:44:19

栈实现迷宫求解(c++版)的相关文章

利用栈实现迷宫求解

利用栈实现迷宫求解 前言:众所周知,栈是(First in last out)先进后出的数据结构,利用这个属性可以实现类似与回溯的方式,比如当前数据满足条件,则入栈,否则出栈返回上一级,依次循环. 在本题中,将每个迷宫路径上的点封装成上下左右四个方向数节点,先入栈迷宫入口节点,如果上下左右没被使用,则将其上下左右的点入栈,否则出栈.如果最终达到迷宫终点则成功,否则失败. 如下是每个节点的数据结构 1 typedef struct{ 2 int top; 3 int bottom; 4 int l

数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值

一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚,所以很多需要自己揣摩.这也体现了算法和程序设计语言的特点,算法更侧重本质的描述,而任何编程语言都要照顾到实现的细节以及数据类型等语法方面的需求. 表达式求值: [编码中....] 二.头文件 迷宫求解: 1 //3_2_maze.h 2 /** 3 author:zhaoyu 4 email:[em

迷宫问题求解(一)利用栈与递归求解出口

本文适合于对迷宫问题已有初步研究,或阅读代码能力较强的人. 因此,如果你对迷宫问题一无所知,请参考其他更详细的资料. 迷宫问题,是一个对栈(Stack)典型应用的例子之一. 假如,有如下10X10的迷宫(0代表通路,1代表障碍),我们需要用写程序来找出迷宫的出口. 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 1 1 1 1 0 0

迷宫求解

1.找出一条迷宫通路 //迷宫求解. #include"stdlib.h" #include"stdio.h" #include<stack> #include<iostream> using namespace std; typedef struct Pseat{ int x; int y; bool operator==(Pseat& rhs) { return x==rhs.x&&y==rhs.y; } //操作

转载:迷宫求解

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

AI-随机迷宫&amp;迷宫求解

本文记录了,人工智能中简单的搜索策略中的路径搜索策略中的A*算法,来实现迷宫寻路的问题.(这只是一次本人的课外作业) 完整的程序源码已经发送到我的Git.这里只记录了我的思路和感想以及收获. 产生随机迷宫 迷宫求解没有迷宫怎么可以呢.而本人是个懒人,每次都要手动输入迷宫,重复性的工作让我很不爽.你可以在程序中用数组定义一个迷宫啊,有强迫症的我,怎么可以这样随便的要求自己的程序呢.及时求解算法的出来了,但是测试数据有限,还是让我很不爽的,所以,干脆先花一些时间,写个随机迷宫的产生吧. 遇事先搜索,

数据结构应用:利用栈破解迷宫游戏

最近刚开始学数据结构,发现数据结构真是个神奇的东西哈,很多现实中的问题都可以用不同的数据结 构来解决,比如利用和栈中缀表达式编写一个计算机程序,利用栈破解迷宫游戏,今天我就来跟大家分 享一下如何利用栈来破解迷宫游戏. 学过数据结构的人都知道,栈的特点是:后进先出(First In Last Out);也就是说只能在栈的尾部进 行压栈和出栈,而且出栈的时候只能从最后一个数据开始.如下图: 而我们在破解迷宫游戏的时候采用的方法是"回溯",也就是在寻找通路的时候,每找到一个通路,就将这个数据

看数据结构写代码(13)栈的应用(四) 迷宫求解

这是一个 用 穷举法 解 迷宫问题 的一个示例,但在 效率 和 解的 最短路径上 就稍显不足了. 这 两个问题,留在 以后 空闲 时刻 解答. 欢迎指出代码不足 下面上代码: // Maze.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <stdlib.h> struct Postion { int x; int y; }; typedef int Direction; struct ElementType { P

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很