1. 程式人生 > >一個搜索迷宮出路的程序

一個搜索迷宮出路的程序

color eas ood 技術 ace 否則 iss position i+1

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

執行 效果圖

技術分享

一個搜索迷宮出路的程序