【資料結構】遞迴求解迷宮問題
阿新 • • 發佈:2019-01-22
資料結構 遞迴求解迷宮問題
參考程式碼如下:/* 名稱:遞迴求解迷宮問題 編譯環境:VC++ 6.0 日期: 2014年4月1日 */ #include<stdio.h> #include<windows.h> // 迷宮座標位置型別 struct PosType { int x; // 行值 int y; // 列值 }; #define MAXLENGTH 25 // 設迷宮的最大行列為25 typedef int MazeType[MAXLENGTH][MAXLENGTH]; // [行][列] // 全域性變數 struct PosType end; // 迷宮終點位置 MazeType m; // 迷宮陣列 int x, y; // 迷宮行數,列數 // 定義牆元素值為0,可通過路徑為-1,通過路徑為足跡 // 輸出解 void Print(int x,int y) { int i,j; for(i=0;i<x;i++) { for(j=0;j<y;j++) printf("%3d",m[i][j]); printf("\n"); } printf("\n"); } // 由當前位置cur、當前步驟curstep試探下一點 void Try(struct PosType cur,int curstep) { int i; struct PosType next; // 下一個位置 // {行增量,列增量} struct PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; // 移動方向,依次為東南西北 for(i=0;i<=3;i++) // 依次試探東南西北四個方向 { next.x=cur.x+direc[i].x; next.y=cur.y+direc[i].y; if(m[next.x][next.y] == -1) // 是通路 { m[next.x][next.y]=++curstep; if(next.x != end.x || next.y != end.y) // 沒到終點 Try(next,curstep); // 試探下一點(遞迴呼叫) else Print(x,y); // 輸出結果 m[next.x][next.y]=-1; // 恢復為通路,試探下一條路 curstep--; } } } // 0為牆,-1為通道 int main() { struct PosType begin; //起點 int i,j,x1,y1; printf("請輸入迷宮的行數,列數(包括外牆):(空格隔開)"); scanf("%d%d",&x,&y); for(i=0;i<x;i++) // 定義周邊值為0(同牆) { m[0][i]=0; // 迷宮上面行的周邊即上邊牆 m[x-1][i]=0;// 迷宮下面行的周邊即下邊牆 } for(j=1;j<y-1;j++) { m[j][0]=0; // 迷宮左邊列的周邊即左邊牆 m[j][y-1]=0;// 迷宮右邊列的周邊即右邊牆 } for(i=1;i<x-1;i++) for(j=1;j<y-1;j++) m[i][j]=-1; // 定義通道初值為-1 printf("請輸入迷宮內牆單元數(即牆的個數):"); scanf("%d",&j); if(j) printf("請依次輸入迷宮內牆每個單元的行數,列數:(空格隔開)\n"); for(i=1;i<=j;i++) { scanf("%d%d",&x1,&y1); m[x1][y1]=0; } printf("迷宮結構如下:\n"); Print(x,y); printf("請輸入起點的行數,列數:(空格隔開)"); scanf("%d%d",&begin.x,&begin.y); printf("請輸入終點的行數,列數:(空格隔開)"); scanf("%d%d",&end.x,&end.y); m[begin.x][begin.y]=1; Try(begin,1); // 由第一步起點試探起 system("pause"); return 0; } /* 輸出效果: 請輸入迷宮的行數,列數(包括外牆):(空格隔開)4 4 請輸入迷宮內牆單元數(即牆的個數):1 請依次輸入迷宮內牆每個單元的行數,列數:(空格隔開) 1 2 迷宮結構如下: 0 0 0 0 0 -1 0 0 0 -1 -1 0 0 0 0 0 請輸入起點的行數,列數:(空格隔開)1 1 請輸入終點的行數,列數:(空格隔開)2 2 0 0 0 0 0 1 0 0 0 2 3 0 0 0 0 0 請按任意鍵繼續. . . */
執行結果如下: