c++------用结构体以及栈的使用来解决迷宫问题

待解决问题:

心理学家把一只老鼠从一个无顶盖的大盒子的入口赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。

这个题目的本质是迷宫找路问题,再次笔者以c++语言使用结构体和栈等数据结构来解决此问题。



代码实现如下:



#include <iostream>
using namespace std;
struct Point                                        //结构体 保存位置的坐标 
{
int x;
int y;
};
void xz(int dt[][10], Point s, Point e);          //找路径  
void ot(int dt[][10]);                           //打印迷宫和路径
int dt[10][10]={
{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},                 // 迷宫图
{-1, 0, -1,-1, 0, 0, 0,-1, 0,-1},
{-1, 0, 0, 0, 0,-1,-1, 0, -1,-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, 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}};
void main()
{
    Point s={1,1};
Point e = {8,8};
    xz(dt,s,e);
ot(dt);
}


void ot(int dt[][10])   
{
for (int i=0;i<10;i++)
{
for (int j=0;j<10;j++)
{
if (dt[i][j]==-1) cout<<"■";
else if (dt[i][j]==2) cout<<" *";
else cout<<"□";
}
cout<<endl;
}
cout<<endl;
}
void xz(int dt[][10], Point cur, Point end)
{
Point Stack[128];                                //栈  保存当前的位置
int top = -1;
do
{
dt[cur.x][cur.y] = 2;
Stack[++top].x = cur.x;
Stack[top].y = cur.y;
if (dt[cur.x-1][cur.y] == 0)                //向上走
cur.x--;
else if (dt[cur.x][cur.y+1] == 0)           //向右走
cur.y++;
else if (dt[cur.x+1][cur.y] == 0)            //向下走
cur.x++;
else if (dt[cur.x][cur.y-1] == 0)           //向左走
cur.y--;
else
{
dt[Stack[top].x][Stack[top].y] = 1;
top--;
cur.x = Stack[top].x;
cur.y = Stack[top].y;
top--;                                  //当前位置走不通  出栈
}
}while ((top!=-1) &&((cur.x != end.x) || (cur.y!=end.y)));
if((cur.x ==end.x) && (cur.y==end.y))
       dt[cur.x][cur.y] = 2;
if(top==-1)
cout<<"此迷宫无出口"<<endl;
else
cout<<"此迷宫的出口如下"<<endl;
}


此代码较为简单,读者们感兴趣的话可以将此代码拷贝到visual studio中进行测试,当然也可以到以下链接来下载.c文件

连接:http://download.csdn.net/download/qq_28734159/10193533



代码运行之后的效果截图如下:




关键算法分析:

#include <iostream>

using namespace std;

struct Point                                        //结构体保存位置的坐标

{

         intx;                                         //横坐标

         inty;                                         //纵坐标

};

void xz(int dt[][10], Point s, Pointe);          //找路径 

void ot(int dt[][10]);                           //打印迷宫和路径

int dt[10][10]={

{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},                 // 迷宫图

{-1, 0, -1,-1, 0, 0, 0,-1, 0,-1},

{-1, 0, 0, 0, 0,-1,-1, 0, -1,-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, 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}};

void main()

{

   Point s={1,1};                           // 起点位置

         Pointe = {8,8};                          // 终点位置

   xz(dt,s,e);                              //找路径

         ot(dt);                                   //输出找到的路径

}

 

void ot(int dt[][10])                         //输出找到的路径的函数

{

         for(int i=0;i<10;i++)                   //外层for循环

         {

                   for(int j=0;j<10;j++)                 //内层for循环

                   {

                            if(dt[i][j]==-1) cout<<"■";      //数值是-1输出墙壁

                            elseif (dt[i][j]==2) cout<<" *";  //数值是2,输出路径

                            elsecout<<"□";                     //否则输出未走的地方

                   }

                   cout<<endl;

         }

         cout<<endl;

}

void xz(int dt[][10], Point cur, Pointend)

{

         PointStack[128];                                //栈  保存当前的位置

         inttop = -1;

         do

         {

                   dt[cur.x][cur.y]= 2;                        //假设当前位置能走通

                   Stack[++top].x= cur.x;                      //将能走通的位置入栈

                   Stack[top].y= cur.y;

                   if(dt[cur.x-1][cur.y] == 0)               //向上走

                            cur.x--;

                   elseif (dt[cur.x][cur.y+1] == 0)           //向右走

                            cur.y++;

                   elseif (dt[cur.x+1][cur.y] == 0)           //向下走

                            cur.x++; 

                   elseif (dt[cur.x][cur.y-1] == 0)           //向左走

                            cur.y--;

                   else                                        //四个方向都走不通

                   {

                            dt[Stack[top].x][Stack[top].y]= 1;     //标志位当前位置走不通

                            top--;                                   //当前位置出栈

                            cur.x= Stack[top].x;                   //回溯到上一位置

                            cur.y= Stack[top].y;                    //回溯到上一位置

                            top--;                                  //当前位置走不通  出栈

                   }

         }while((top!=-1) &&((cur.x != end.x) || (cur.y!=end.y)));      //循环结束的条件  当栈为空(无路能走到终点)或者走到终点

         if((cur.x==end.x) && (cur.y==end.y))                           //若走通,将最后的位置标记为走通

      dt[cur.x][cur.y] = 2;

         if(top==-1)                                                     //栈为空,该迷宫无路

                   cout<<"此迷宫无出口"<<endl;

         else                                                            //输出能走出该迷宫的路径

                   cout<<"此迷宫的出口如下"<<endl;

}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值