C++之迷宫问题

问题描述
   迷宫问题: 迷宫问题的求解是实验心理学中的一个经典问题,心理学家把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫,迷宫中设置很多墙壁,对前进的方向形成了多处
障碍,心理学家在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以达到出口。设计算法实现迷宫问题。迷宫示意图,其中1代表有障碍,0代表无障碍,前进方向
有四个,分别是上,下, 左,右。
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 1 0 1
1 0 1 1 1 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
输入
  入口坐标与出口坐标
输出
    输出其中一条路径(包括出口入口坐标),如果没有路径则输出 no way
解决思路
    将所有的路径都穷举出来,知道找到出口。使用DSF(深度搜索法)算法实现。

代码
 #include<iostream>
 #define MAX 100
using namespace std;
struct p{
int x;
int y;
};
int vi[10][10]={0};//用做标记路径
class Stack{ //栈的具体编写
int top;
p s[MAX];
 
public:
    Stack(){top=-1;}
    bool emtry(){//栈空判定
        if(top==-1){return 1;}
        else {return 0;
        }
    }
    bool push(p a){//压栈
    top++;s[top].x=a.x;s[top].y=a.y;return 1;
    }
    bool bout(){
    if(emtry()){return 0;}
    else {top--;return 1;}
    }
    p ntop(){return s[top];
    }
    void sc(){
        int m=top;
        int d[MAX][2];
        int i;
        for(i=0;i<m;i++)
        {
            d[i][0]=s[i].x;
            d[i][1]=s[i].y;
        }
        for(i=0;i<m;i++)
        {
            cout<<d[i][0]<<" "<<d[i][1]<<endl;
        }
    }
};
bool pass(int x,int y,int (*Map)[10]){//判断该点是否可以走
    if(x<0||x>9){return 0;
    }
    else if(y<0||y>9){return 0;
    }
    else if(vi[x][y]==1){return 0;
    }
    else if(Map[x][y]==1){return 0;
    }
    else return 1;
}
void slove(p c,Stack &a,int (*Map)[10]){
p l=a.ntop();
if(l.x==c.x&&l.y==c.y){return ;
}
if(pass(l.x,l.y+1,Map))
{ p m;
m.x=l.x;m.y=l.y+1;
vi[m.x][m.y]=1;
a.push(m);  
 
slove(c,a,Map);
}
else if(pass(l.x,l.y-1,Map))
{ p m;
m.x=l.x;m.y=l.y-1;
vi[m.x][m.y]=1;
a.push(m);  
 
slove(c,a,Map);
}
 else if(pass(l.x-1,l.y,Map))
{ p m;
m.x=l.x-1;m.y=l.y;
vi[m.x][m.y]=1;
a.push(m);  
 
slove(c,a,Map);
}
 else if(pass(l.x+1,l.y,Map))
{ p m;
m.x=l.x+1;m.y=l.y;
vi[m.x][m.y]=1;
a.push(m);  
 
slove(c,a,Map);
}
else {
    if(a.bout()){slove(c,a,Map);
    }
    else {cout<<"no way";
    }
}
 /*
slove()原理;
递归出口为找到出口或者没有出口的条件下整个地图被全部遍历
将入口读出;
分别进行上下左右移动并判定是否可走;
如果可走则将其压栈,标记(为了),并递归;
否则返回上一步
*/
 
 
}
int main()
{
int Map[10][10]={
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,1,1,1,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},
};
p c,r;
Stack a;
cin>>r.x>>r.y>>c.x>>c.y;
vi[r.x][r.y]=1;
a.push(r);//将入口压栈
slove(c,a,Map);
if(!a.emtry())//结果判定
{   a.push(c);
    a.sc();
    }   
     
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值