一个搜索迷宫出路的程序

/*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; }

执行 效果图


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值