一个搜索迷宫出路的程序

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

运行 效果图


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值