/*1.定义一个结构体position
结构体中包含一个方块的行列号和下一个
可走方块的方位号
2.定义一个结构体。
包括一个一个position结构体,一个栈顶指针
3.定义入栈,出栈,取栈顶函数
4.定义迷宫,
0:不通
1:通路
-1:已经走过的路,每次入栈后将位置改为-1,表示已经走过
默认最外围是墙,(1.1)是入口,(ROW-2.COL-2)是出口
5.解迷宫:
1)入口进栈,
2)进入while循环,结束条件为栈空
{
判断当前位置是否为出口,是,打印路径,结束
不是,按照上,右,下,左的顺序试探,通路则入栈,
并记录该路径的方位号
如果4路都不通,将该位置标示为-1,在以后的试探中不会再走此路
}
6.绘图工具的坐标:X 轴向右为正(行即ROW),Y 轴向下为正(列即COL)
每入栈一个位置,涂一次色,出栈后涂另一种色
*/
#include <iostream>
#include <time.h>
#include<cstdio>
#include <graphics.h>
#include<conio.h>
using namespace std;
#define Row 15
#define Col 16
#define MaxSize Row*Col
typedef struct
{
int i;
int j;
int nextNum;
}position;
typedef struct
{
position data[MaxSize];
int top;
}MyType;
MyType P;
void push(position e)//入栈
{
P.top++;
P.data[P.top].i=e.i;
P.data[P.top].j=e.j;
P.data[P.top].nextNum=e.nextNum;
}
void pop(position &e)//出栈
{
e.i=P.data[P.top].i;
e.j=P.data[P.top].j;
e.nextNum=P.data[P.top].nextNum;
P.top--;
}
int GetTop()//取栈顶指针
{
return P.top;
}
int main()
{
P.top=-1;
int mp[Row][Col]={0};//初始化地图每个方格
int x,y,k;
initgraph(Col*40+100,Row*40+80);//初始化图形
setbkcolor(LIGHTCYAN);
cleardevice();
for(int i=0;i<Row+1;i++) //画横线
{
setcolor(BLACK);
line(50,50+40*i,50+Col*40,50+40*i);
}
for(int j=0;j<Col+1;j++) //画竖线
{
setcolor(BLACK);
line(50+40*j,50,50+40*j,50+Row*40);
}
srand((unsigned)time(NULL));//生成随机种子
for(x=1; x<Row-1; x++)
{
//生成迷宫
for(y=1; y<Col-1; y++)
{
k = rand()%3;//控制通路占2/3,障碍占1/3;
if(k<1)
mp[x][y] = 0;
else
mp[x][y] = 1;
}
}
mp[1][1]=1;
mp[Row-2][Col-2]=1;
for(x=0;x<Row;x++)
{
for(y=0;y<Col;y++)
{
if(mp[x][y]==0) //障碍涂红色
{
setfillcolor(RED);
floodfill(60+40*y,60+40*x,BLACK);
}
}
}
setfillcolor(BLACK);
floodfill(0,0,BLACK);
//开始入栈
P.top++;
P.data[P.top].i=1;
P.data[P.top].j=1;
P.data[P.top].nextNum=0;
mp[1][1]=-1;
//第一步涂成蓝色
setfillcolor(BLUE);
floodfill(100,100,BLACK);
//Sx当前方块的x,Sy为当前方块的y,Sid为下一个可走方块的方位号
int Sx=0,Sy=0,Sid=0,m=0;
while(P.top>-1)
{//进入循环试探
Sx=P.data[P.top].i; //取栈顶
Sy=P.data[P.top].j;
Sid=P.data[P.top].nextNum;
if(Sx==Row-2&&Sy==Col-2) //判断当前位置是否为出口
{break;}
int find =0; //用于判断是否找到通路
while(Sid<5&&find==0) //循环试探四个方向是否有路
{
Sid++;
switch(Sid)
{
case 4:
Sx=P.data[P.top].i-1;
Sy=P.data[P.top].j;
break;
case 1:
Sx=P.data[P.top].i;
Sy=P.data[P.top].j+1;
break;
case 2:
Sx=P.data[P.top].i+1;
Sy=P.data[P.top].j;
break;
case 3:
Sx=P.data[P.top].i;
Sy=P.data[P.top].j-1;
break;
}
if(mp[Sx][Sy]==1) //找到通路
find=1; //否则,继续找下一个
}
if(find==1) //下一个方块可走,便入栈
{
P.data[P.top].nextNum=Sid; //修改原来栈顶的next_id的值
P.top++; //入栈
P.data[P.top].i=Sx;
P.data[P.top].j=Sy;
P.data[P.top].nextNum=0;
//入栈涂色
setfillcolor(BLUE);
floodfill(60+Sy*40,60+Sx*40,BLACK);
Sleep(100);
mp[Sx][Sy]=-1; //避免重复走到该块
}
else //即四路都不通,标记为不可走 0,然后出栈
{
mp[P.data[P.top].i][P.data[P.top].j]=0;//将该处标记为不可走
setfillcolor(GREEN);//出栈涂色
floodfill(60+P.data[P.top].j*40,60+P.data[P.top].i*40,BLACK);
Sleep(100);
P.top--;
}
}
if(P.top==-1)
{
settextcolor(RED);
settextstyle(100,100,"宋体");
outtextxy(150,300,"失败");
}
else
{
settextcolor(RED);
settextstyle(100,100,"宋体");
outtextxy(150,300,"胜利");
}
getchar();
closegraph();
return 0;
}
运行 效果图