迷宫求解

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;
    }   //操作符重载
};

typedef struct{
    Pseat seat;   //通道块在迷宫中的位置
    int di;     //下一通道块的方向
}ElemType;

Pseat findNextSeat(Pseat cur,int di)  //结构体是可以直接返回的?
{
    Pseat nextSeat;
    if(di==1)
    {
        nextSeat.x=cur.x+1;
        nextSeat.y=cur.y;
    }
    else if(di==2)
    {
        nextSeat.x=cur.x;
        nextSeat.y=cur.y+1;
    }
    else if(di==3)
    {
        nextSeat.x=cur.x-1;
        nextSeat.y=cur.y;
    }
    else if(di==4)
    {
        nextSeat.x=cur.x;
        nextSeat.y=cur.y-1;
    }
    return nextSeat;
}

//只找出了其中的一条路
stack<ElemType> findPath(int migong[][10],Pseat start,Pseat end)   //栈可以返回
{
    ElemType *current;
    stack<ElemType> path;
    Pseat curpos=start;    //当前路径。注意结构体初始化的方法
    do
    {
        if(migong[curpos.x][curpos.y]==0)   //当前位置为迷宫墙壁则为-1,当前位置可通则为0,当前位置已经走过则为1,当前位置不通则为2
        {
            migong[curpos.x][curpos.y]=1;   //留下足迹,走过的位置置1
            current=new ElemType();
            current->di=1;
            current->seat.x=curpos.x;
            current->seat.y=curpos.y;
            path.push(*current);    //加入路径
            if(curpos==end)   //为出口,则结束.注意,在这里curpos==end是错的
                return path;
            else                                //否则切换到该点的东邻为下一个点
            {
                curpos=findNextSeat(curpos,1);
            }
        }
        else
        {
            current=&path.top();
            if(current->di==4)  //如果当前位置不通,并且栈顶块的4个方向都探索完,则弹出栈顶元素
            {
                migong[current->seat.x][current->seat.y]=2;   //留下不能通过的足迹
                path.pop();
            }
            else                //否则就换一个方向探索
            {
                (current->di)++;
                curpos=findNextSeat(current->seat,current->di);
            }
        }
    } while (!path.empty());
    return path;
}

void main()
{
    int migong[][10]={{-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}};
    Pseat start={1,1};
    Pseat end={8,8};
    stack<ElemType> path=findPath(migong,start,end);
    while(!path.empty())
    {
        cout<<path.top().seat.x<<","<<path.top().seat.y<<endl;
        path.pop();
    }
}

2.找出所有的迷宫通路

时间: 2024-12-16 02:58:47

迷宫求解的相关文章

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

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

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

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

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

相信大家都应该听过栈吧,一直想利用栈来实现一个算法,最近有点空,就利用栈的先进后出的特性来完成迷宫求的问题,下面将详细介绍栈的实现和迷宫求解的过程,可以很好的学习栈的使用. 栈有两种实现方法,一种是顺序,即数组形式,一种是线性,即链表形式,个人还是比较喜欢链表形式实现栈的基本功能. 首先弄一个简单的迷宫,如图: 我们很容易看出这个迷宫解的路径,那怎么让计算机帮我们求解出来呢. 首先我们要对迷宫数据化,很容易想到二维数组来表示,0表示通路,1表示障碍,即表示为: int map[4][4]={ {

转载:迷宫求解

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

利用栈实现迷宫求解

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

迷宫求解系统

编程语言:c++ 代码如下: main.cpp 1 #include <iostream> 2 #include <stack> 3 #include <stdio.h> 4 #include <windows.h> 5 #include "show.cpp" 6 #define N 100 7 #include "jiegou.cpp" 8 #include "shuru.cpp" 9 #incl

7.7 迷宫求解

7-8 Maze1.c 1 #include <stdio.h> 2 #define MAXLEN 30 // 迷宫包括外墙最大行列数目 3 #define INIT_SIZE 100 // 存储空间初始分配量 4 typedef struct 5 { 6 int row; //迷宫的行数 7 int column; //迷宫的列数 8 char grid[MAXLEN][MAXLEN]; //1表示障碍,0表示空,2表示可通,3表示已走过但不通 9 }MazeType; // 迷宫类型 10

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

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

应用栈求解迷宫问题(C++实现)

栈是数据结构中一种重要的线性结构,限定仅在表尾进行插入和删除操作的线性表,因此我们也可以认为它是一种特殊的线性表.由于栈的这个特点,我们又可以称其为后进先出的结构.如图所示: 由于栈具有后进先出的性质我们可以利用,是程序设计中一个有用的工具.利用栈我们可以来实现数制转换.后缀表达式求值.迷宫求解等等.在书本上我们可以看到用C语言实现的简单思路,但是程序仍旧存在许多bug.今天,我想尝试用强大的C++来实现. 迷宫问题的求解思路大致则是从入口出发,顺着某一方向向前探索,若能走通,则继续向前探索:若