#include
#include
#include
using namespace std;
int *curpos=new int[2];//当前位置
int dir[2];//记录朝各个方向走时的下一个通道快的位置
vector printfoot;//记录足迹
//用二位数组表示迷宫,1位可行走处,0位障碍处
int area[10][10]={
0,0,0,0,0,0,0,0,0,0,
0,1,1,0,1,1,1,0,1,0,
0,1,1,0,1,0,1,0,1,0,
0,1,1,1,1,0,1,1,1,0,
0,1,0,0,0,1,1,1,1,0,
0,1,1,1,0,1,1,1,1,0,
0,1,0,1,0,1,0,1,0,0,
0,1,0,0,0,1,0,0,1,0,
0,0,1,1,1,1,1,0,1,0,
0,0,0,0,0,0,0,0,0,0};
//定义通道快结构体
struct block{
int ord;
int seat[2];
int di;};
bool canpass(stack&,int *);//判断下一位置是否可以走通
bool print(int x,int y);//判断下一通道快是否是曾经纳入的路径块
int main(){
//输出迷宫
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(area[i][j]==0) cout<
else cout<
}
cout<
}
cout<
//对各变量初始化
curpos[0]=1;curpos[1]=1;
printfoot.push_back(curpos);
stack s;
block b1;
b1.ord=0;
(b1.seat)[0]=1;
(b1.seat)[1]=1;
b1.di=0;
s.push(b1);
//开始探索路径
while(curpos[0]!=8||curpos[1]!=8){
if(canpass(s,curpos)==true){
int *p=new int[2];
p[0]=curpos[0];p[1]=curpos[1];
printfoot.push_back(p);
}
else{
s.pop();
block b=s.top();
curpos[0]=b.seat[0];curpos[1]=b.seat[1];
}
if((s.top().seat)[0]==1&&(s.top().seat)[1]==1) break;
}
//输出探索完的路径
if((s.top().seat)[0]==1&&(s.top().seat)[1]==1) {
cout<
return 1;
}
else{
cout<
printfoot.clear();
while(s.empty()==false){
int *p=new int[2];
p[0]=(s.top().seat)[0];p[1]=(s.top().seat)[1];
printfoot.push_back(p);
s.pop();}
vector::iterator it;
int judge=0;
for(int i=0;i<10;i++){
for(int j=0;j<10;j++){
if(area[i][j]==0) cout<
else{
judge=0;
for(it=printfoot.begin();it!=printfoot.end();it++){
if((*it)[0]==i&&(*it)[1]==j){
judge++;
cout<
break;
} }
if(judge==0) cout<
cout<
}
return 0;}
//函数实现
bool canpass(stack &s,int * curpos){
int di=s.top().di;
while(di<4){
switch(di){
case 0:{dir[0]=curpos[0]+1;dir[1]=curpos[1];break;}
case 1:{dir[0]=curpos[0];dir[1]=curpos[1]+1;break;}
case 2:{dir[0]=curpos[0]-1;dir[1]=curpos[1];break;}
case 3:{dir[0]=curpos[0];dir[1]=curpos[1]-1;break;}}
if(area[dir[0]][dir[1]]==0||print(dir[0],dir[1])==true){di++;}
else{
block *b=new block;
b->ord=s.top().ord+1;
(b->seat)[0]=dir[0]; (b->seat)[1]=dir[1];
b->di=0;
s.push(*b);
curpos[0]=dir[0];curpos[1]=dir[1];
return true;}}
return false;}
bool print(int x,int y){
vector::iterator it;
for(it=printfoot.begin();it!=printfoot.end();it++)
if((*it)[0]==x&&(*it)[1]==y) {
return true;}
return false;}
测试结果:
无法走通
能走通