问题描述
迷宫问题: 迷宫问题的求解是实验心理学中的一个经典问题,心理学家把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫,迷宫中设置很多墙壁,对前进的方向形成了多处
障碍,心理学家在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以达到出口。设计算法实现迷宫问题。迷宫示意图,其中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";
}
}
---------------------
作者:Exist1001
来源:优快云
原文:https://blog.youkuaiyun.com/exist1001/article/details/78516431
版权声明:本文为博主原创文章,转载请附上博文链接!