您的位置:首页 > 编程语言 > C语言/C++

c++实现的简易的迷宫算法

2012-12-06 18:22 381 查看
运行环境为MS VC6.0,如果在VS上编译,请将头文件改为

#include<iostream>

using namespace std;

****************************以下为原代码**********************************

很简单的代码

#include<iostream.h>

int const max=100;

int const m=6;

int const n=8;

int maze[m+2][n+2]={{1,1,1,1,1,1,1,1,1,1},//定义(6*8)的迷宫,入口为(1.1),出口为(6.8)

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

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

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

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

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

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

{1,1,1,1,1,1,1,1,1,1}};

typedef struct //方向封装

{

int x,y;

}item;

item move[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};//move数组

typedef struct //栈元素封装

{

int x,y,d;

}yuansu;

typedef struct//定义栈

{

yuansu data[max];

int top;

}seqstack;

seqstack *init_seqstack(seqstack *s) //初始化栈

{

if(!s)

{

cout<<"空间不足"<<endl;

return 0;

}

else

{s->top=-1; return s;}

}

int empty_seqstack(seqstack *s)//判断空栈

{ if(s->top==-1)

return 1;

else

return 0;

}

int push_seqstack(seqstack *s,yuansu temp)//入栈

{

if(s->top==max-1)

return 0;

else

{

s->top++;

s->data[s->top]=temp;

return 1;

}

}

int pop_seqstack(seqstack *s,yuansu &temp) //出栈

{

if(empty_seqstack(s))

return 0;

else

{

temp=(s->data[s->top]);

s->top--;

return 1;

}

}

int path(seqstack *s,item move[8],int maze[8][10]) //迷宫算法

{

yuansu temp;

int x,y,d,i,j;

temp.x=1;

temp.y=1;

temp.d=-1;//初始化入口坐标和方向

push_seqstack(s,temp);

while(!empty_seqstack(s))//while

{

pop_seqstack(s,temp);//出栈并保存栈顶元素

x=temp.x;

y=temp.y;

d=temp.d+1;

while(d<8)//开始做8个方向的测试,如果为0则可以到达

{

i=x+move[d].x;

j=y+move[d].y;

if(maze[i][j]==0)//判断是否可以到达

{

temp.x=x;

temp.y=y;

temp.d=d;//将可到达的坐标的信息传递给临时变量temp

push_seqstack(s,temp);//坐标及方向入栈

x=i;

y=j;

maze[x][y]=-1;//到达新点,将新点标志为-1

if(x==m&&y==n)//到达出口坐标,如果有路,返回成功代码1

return 1;

else

d=0;//重新初始化方向

}

else

d++;

}

}

return 0;//迷宫无路,返回失败代码0

}

void main()//主函数main

{

int a,b,d=0;

cout<<"############迷宫算法#################"<<endl;

cout<<"迷宫初始化状态为:"<<endl;

for(a=1;a<8;a++)//输出显示迷宫初始状态

{ for(b=1;b<10;b++)

{

if(maze[a][b]==-1)

cout<<" "<<maze[a][b];

else

cout<<" "<<maze[a][b];

}

cout<<endl;

}

seqstack *s;

s=new seqstack;//新栈

init_seqstack(s);

path(s,move,maze);

cout<<"标记出路为:"<<'\n'<<"注: 0为起点,→表示路线,*表示出口或死路"<<endl;

for(a=1;a<8;a++)

{ for(b=1;b<10;b++)

{

if(maze[a][b]==-1) //遇见-1时输出箭头

{

maze[a][b]=2; //输出过的置为2

while(d<8) //选择合适箭头输出

{

if(maze[a+move[d].x][b+move[d].y]==-1)

{ switch(d)

{ case 0:cout<<"→";d=9;break;

case 1:cout<<"↘";d=9;break;

case 2:cout<<"↓";d=9;break;

case 3:cout<<"↙";d=9;break;

case 4:cout<<"←";d=9;break;

case 5:cout<<"↖";d=9;break;

case 6:cout<<"↑";d=9;break;

case 7:cout<<"↗";d=9;break;

}

}

d++;

}

if(d==8)

cout<<" *"; //没出路或到出口时输入“*”

}

else

cout<<" "<<maze[a][b]; //输入普通值

d=0; //输出完后置为0

}

cout<<endl;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: