码迷,mamicode.com
首页 > 其他好文 > 详细

迷宫求解

时间:2015-09-11 17:30:35      阅读:133      评论: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;
    }   //操作符重载
};

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.找出所有的迷宫通路

迷宫求解

标签:

原文地址:http://www.cnblogs.com/wy1290939507/p/4801436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!