c++ 迷宫思路_C++ 简单迷宫

本文介绍了一种使用C++实现的简单迷宫求解算法。通过二维数组表示迷宫,并使用栈来存储路径信息。利用深度优先搜索策略探索路径,当找到出口时输出路径,若无法走通则输出失败。代码中包含了迷宫的定义、路径判断、打印足迹等功能。
摘要由CSDN通过智能技术生成

#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;}

测试结果:

d49708da1d0c

无法走通

d49708da1d0c

能走通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值