一个搜索迷宫出路的程序

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

执行 效果图


原文地址:https://www.cnblogs.com/zhchoutai/p/7392266.html