一個搜索迷宮出路的程序
阿新 • • 發佈:2017-08-18
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; }
執行 效果圖
一個搜索迷宮出路的程序