迷宫求解(栈实现)

来源:互联网 发布:windows视频放大缩小 编辑:程序博客网 时间:2024/06/07 23:49

迷宫求解(栈实现)

自己写的,外面别人的看了一下,感觉不少都是递归解决这类问题的,然后我尝试用非递归解决的。混合了类的运用,多说不如直接上代码了。

#include<iostream>#include<stdio.h>#include<stack>#define M 8using namespace std;struct Pos {int i;int j;};class Maze{    public:    Maze()=default;    Maze(int a1,int b1,int a2,int b2)    {        start_.i=a1;        start_.j=b1;        end_.i=a2;        end_.j=b2;    }    ~Maze()=default;    void CreateMaze();    void PrintMaze();    bool MakeIt();    private:        int Ma_ze[M][M];        Pos start_;        Pos end_;};void Maze::CreateMaze( ){    int i=0,j=0;    int a=0;    for (i=0;i<M;i++)    {        for (j=0;j<M;j++)        {         cin>>a;         Ma_ze[i][j]=a;        }    }    Ma_ze[start_.i][start_.j]=1;}void Maze::PrintMaze( ){    int i=0,j=0;    for (i=0;i<M;i++)    {        for (j=0;j<M;j++)        {         if (Ma_ze[i][j]==2)         {             cout<<"●";         }         else if(Ma_ze[i][j]==0)         {             cout<<"  ";         }         else if (Ma_ze[i][j]==1)         {             cout<<"**";         }        }        cout<<endl;    }}bool Maze::MakeIt()//完成路径寻找{    bool issuccess=false;    stack <Pos> make;    Pos alit,blit;    make.push(start_);    while (1)    {        if (make.empty()==true)        {            break;        }        alit=make.top();        //cout<<alit.i<<"  "<<alit.j<<endl;        //make.pop();        if (Ma_ze[alit.i+1][alit.j]==0)        {            blit.i=alit.i+1;            blit.j=alit.j;            Ma_ze[alit.i+1][alit.j]=1;            if (blit.i==end_.i&&blit.j==end_.j)            {                issuccess=true;                break;            }            make.push(blit);        }        else  if (Ma_ze[alit.i][alit.j+1]==0)        {            blit.i=alit.i;            blit.j=alit.j+1;            Ma_ze[alit.i][alit.j+1]=1;            if (blit.i==end_.i&&blit.j==end_.j)            {                issuccess=true;                break;            }            make.push(blit);        }        else  if (Ma_ze[alit.i-1][alit.j]==0)        {            blit.i=alit.i-1;            blit.j=alit.j;            Ma_ze[alit.i-1][alit.j]=1;               if (blit.i==end_.i&&blit.j==end_.j)            {                issuccess=true;                break;            }            make.push(blit);        }        else  if (Ma_ze[alit.i][alit.j-1]==0)        {            blit.i=alit.i;            blit.j=alit.j-1;            Ma_ze[alit.i][alit.j-1]=1;            if (blit.i==end_.i&&blit.j==end_.j)            {                issuccess=true;                break;            }            make.push(blit);        }        else        {            make.pop();        }    }    return issuccess;}int main(){    Maze m(1,1,6,6);    freopen("maze.txt","r",stdin);    m.CreateMaze();    m.PrintMaze();    if (m.MakeIt()==true)    {        m.PrintMaze();    }    else    {        cout<<"error"<<endl;    }}

这是测试用的数据,“2”表示墙壁,“0”表示可以走。

2 2 2 2 2 2 2 2
2 0 0 2 0 2 0 2
2 2 0 0 0 0 0 2
2 0 0 2 0 2 0 2
2 2 2 2 0 2 0 2
2 2 0 0 0 2 0 2
2 0 0 2 0 0 0 2
2 2 2 2 2 2 2 2

反思就是代码还有很多可以写的更简洁的地方,比较懒想等到以后了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 胃口太好越来越胖怎么办 心情一紧张心跳手抖怎么办 消防兵新兵连俯卧撑不够怎么办 cf枪王永久禁赛怎么办 换了手机号花呗怎么办 xp系统无限重启怎么办 魔域配置资源读取错误怎么办 魔域异地交易了怎么办 魔域手游宝宝亲密度不够怎么办 魔域手游怎么改密码忘了怎么办 魔域装备注灵怎么办 lol外服账号忘记了怎么办 美服lol下载慢怎么办 台服天堂2延迟怎么办 梦幻专用瑞兽没有泰山怎么办 冲错了游戏点券怎么办 新手玩联盟很菜怎么办 cf玩一会儿卡退怎么办 魔域先锋区封号了怎么办 吃了减肥药头疼怎么办 冬天没用完的霜怎么办 手表带起来大了怎么办 碰到舞警打人该怎么办 合租者偷了东西却没有证据怎么办 钥匙锁在房间了怎么办 家里门钥匙丢了怎么办 合租朝北晒衣服怎么办 卧室门钥匙丢了怎么办 邻居在我家防盗窗上凉被子怎么办 有钥匙打不开门怎么办 白色腈纶衣服洗完发黄怎么办 在部队有人整你怎么办 老公掉粪坑了你怎么办图片 好久没跑步腿疼怎么办 跑1000米要5分钟怎么办 孩子眼睛近视加散光怎么办 在部队混的差怎么办 2岁宝宝走路踮脚怎么办 宝宝走路膝盖弯曲不直怎么办 做了蛙跳大腿疼怎么办 跳完蛙跳腿疼怎么办