迷宮求解核心思想:從入口出發,順一個方向向前探索,走得通就繼續向前走;否則沿原路退回並換一個方向繼續探索,直到所有的路都走完為止。
還是用棧的先進后出的結構保存一路的路線。代碼用到了之前寫的棧的順序實現數組格式那個結構。
並且修改和增加了些與迷宮有關的結構體,如下:
1 #define MAZESIZE 10 //測試迷宮大小為10*10大小 2 3 //坐標結構 4 typedef struct 5 { 6 int r; //橫坐標 7 int c; //縱坐標 8 }PosType; 9 10 //棧基本存儲結構 11 typedef struct 12 { 13 int ord; //通道快在道路上的序號 14 PosType seat; //通道快所在的坐標位置 15 int di; //走向下一個通道快的方向 16 }SElemType; 17 18 //棧結構 19 typedef struct 20 { 21 SElemType data[MAXSIZE]; //存儲數組 22 int top; //棧頂 23 }Stack; 24 25 //迷宮結構 26 typedef struct 27 { 28 char arr[MAZESIZE][MAZESIZE]; 29 }MazeType;
迷宮解密核心代碼:
1 #include "Stack.h" 2 3 //判斷當前塊是否可通過 4 Status Pass( MazeType MyMaze,PosType CurPos) 5 { 6 if (MyMaze.arr[CurPos.r][CurPos.c] == ' ') 7 return 1; // 如果當前位置是可以通過,返回1 8 else 9 return 0; // 其它情況返回0 10 } 11 12 //下一個位置 13 PosType NextPos(PosType CurPos, int Dir) 14 { 15 PosType ReturnPos; 16 switch (Dir) 17 { 18 case 1: 19 ReturnPos.r = CurPos.r; 20 ReturnPos.c = CurPos.c+1; 21 break; 22 case 2: 23 ReturnPos.r = CurPos.r+1; 24 ReturnPos.c = CurPos.c; 25 break; 26 case 3: 27 ReturnPos.r = CurPos.r; 28 ReturnPos.c = CurPos.c-1; 29 break; 30 case 4: 31 ReturnPos.r = CurPos.r-1; 32 ReturnPos.c = CurPos.c; 33 break; 34 } 35 return ReturnPos; 36 } 37 38 //迷宮解密函數 39 Status MazePath(MazeType &maze, PosType start, PosType end) 40 { 41 Stack S; //路徑的存儲棧 42 PosType curpos; //當前位置坐標 43 int curstep; //探索步驟 44 SElemType e; //當前坐標塊 45 46 InitStack(S); //初始化棧 47 curpos = start; //初始當前位置為入口 48 curstep = 1; 49 do 50 { 51 if (Pass(maze,curpos)) //當前位置可通過,即是未曾走到過的坐標 52 { 53 maze.arr[curpos.r][curpos.c] = '*'; //留下足跡 54 e.di = 1; 55 e.ord = curstep; 56 e.seat = curpos; 57 Push(S,e); //加入路徑 58 if (curpos.r == end.r && curpos.c == end.c) //到達終點(出口) 59 return OK; 60 curpos = NextPos(curpos, 1); // 下一位置是當前位置的東鄰 61 curstep++; // 探索下一步 62 } 63 else // 當前位置不能通過 64 { 65 if (!StackEmpty(S)) 66 { 67 Pop(S,e); 68 while (e.di == 4 && !StackEmpty(S)) 69 { 70 maze.arr[e.seat.r][e.seat.c] = '!'; 71 Pop(S,e); // 留下不能通過的標記,並退回一步 72 } 73 if (e.di < 4) 74 { 75 e.di++; 76 Push(S, e); // 換下一個方向探索 77 curpos = NextPos(e.seat, e.di); // 當前位置設為新方向的相鄰塊 78 } 79 } 80 } 81 } while (!StackEmpty(S) ); 82 return ERROR; 83 }
做了三個迷宮的測試:其中迷宮中#代表牆不通過空的位置就是通道。最后輸出的迷宮是解密之后的迷宮,通道里的!代表當前位置不通;*代表正確的路徑。
1 /*初始化迷宮*/ 2 void InitMaze1(MazeType &maze) 3 { 4 maze.arr[0][0]=maze.arr[0][1]=maze.arr[0][2]=maze.arr[0][3]=maze.arr[0][4]=maze.arr[0][5]=maze.arr[0][6]=maze.arr[0][7]=maze.arr[0][8]=maze.arr[0][9]= '#'; 5 maze.arr[1][0]=maze.arr[1][3]=maze.arr[1][7]=maze.arr[1][9]= '#'; 6 maze.arr[1][1]=maze.arr[1][2]=maze.arr[1][4]=maze.arr[1][5]=maze.arr[1][6]=maze.arr[1][8]= ' '; 7 maze.arr[2][0]=maze.arr[2][3]=maze.arr[2][7]=maze.arr[2][9]= '#'; 8 maze.arr[2][1]=maze.arr[2][2]=maze.arr[2][4]=maze.arr[2][5]=maze.arr[2][6]=maze.arr[2][8]= ' '; 9 maze.arr[3][0]=maze.arr[3][5]=maze.arr[3][6]=maze.arr[3][9]= '#'; 10 maze.arr[3][1]=maze.arr[3][2]=maze.arr[3][3]=maze.arr[3][4]=maze.arr[3][7]=maze.arr[3][8]= ' '; 11 maze.arr[4][0]=maze.arr[4][2]=maze.arr[4][3]=maze.arr[4][4]=maze.arr[4][9]= '#'; 12 maze.arr[4][1]=maze.arr[4][5]=maze.arr[4][6]=maze.arr[4][7]=maze.arr[4][8]= ' '; 13 maze.arr[5][0]=maze.arr[5][4]=maze.arr[5][9]= '#'; 14 maze.arr[5][1]=maze.arr[5][2]=maze.arr[5][3]=maze.arr[5][5]=maze.arr[5][6]=maze.arr[5][7]=maze.arr[5][8]= ' '; 15 maze.arr[6][0]=maze.arr[6][2]=maze.arr[6][6]=maze.arr[6][9]= '#'; 16 maze.arr[6][1]=maze.arr[6][3]=maze.arr[6][4]=maze.arr[6][5]=maze.arr[6][7]=maze.arr[6][8]= ' '; 17 maze.arr[7][0]=maze.arr[7][2]=maze.arr[7][3]=maze.arr[7][4]=maze.arr[7][6]=maze.arr[7][9]= '#'; 18 maze.arr[7][1]=maze.arr[7][5]=maze.arr[7][7]=maze.arr[7][8]= ' '; 19 maze.arr[8][0]=maze.arr[8][1]=maze.arr[8][9]= '#'; 20 maze.arr[8][2]=maze.arr[8][3]=maze.arr[8][4]=maze.arr[8][5]=maze.arr[8][6]=maze.arr[8][7]=maze.arr[8][8]= ' '; 21 maze.arr[9][0]=maze.arr[9][1]=maze.arr[9][2]=maze.arr[9][3]=maze.arr[9][4]=maze.arr[9][5]=maze.arr[9][6]=maze.arr[9][7]=maze.arr[9][8]=maze.arr[9][9]= '#'; 22 } 23 24 void InitMaze2(MazeType &maze) 25 { 26 maze.arr[0][0]=maze.arr[0][1]=maze.arr[0][2]=maze.arr[0][3]=maze.arr[0][4]=maze.arr[0][5]=maze.arr[0][6]=maze.arr[0][7]=maze.arr[0][8]=maze.arr[0][9]= '#'; 27 maze.arr[1][0]=maze.arr[1][2]=maze.arr[1][9]= '#'; 28 maze.arr[1][1]=maze.arr[1][3]=maze.arr[1][4]=maze.arr[1][5]=maze.arr[1][6]=maze.arr[1][7]=maze.arr[1][8]= ' '; 29 maze.arr[2][0]=maze.arr[2][2]=maze.arr[2][6]=maze.arr[2][7]=maze.arr[2][8]=maze.arr[2][9]= '#'; 30 maze.arr[2][1]=maze.arr[2][3]=maze.arr[2][4]=maze.arr[2][5]= ' '; 31 maze.arr[3][0]=maze.arr[3][2]=maze.arr[3][6]=maze.arr[3][9]= '#'; 32 maze.arr[3][1]=maze.arr[3][3]=maze.arr[3][4]=maze.arr[3][5]=maze.arr[3][7]=maze.arr[3][8]= ' '; 33 maze.arr[4][0]=maze.arr[4][2]=maze.arr[4][3]=maze.arr[4][4]=maze.arr[4][6]=maze.arr[4][9]= '#'; 34 maze.arr[4][1]=maze.arr[4][5]=maze.arr[4][7]=maze.arr[4][8]= ' '; 35 maze.arr[5][0]=maze.arr[5][4]=maze.arr[5][6]=maze.arr[5][9]= '#'; 36 maze.arr[5][1]=maze.arr[5][2]=maze.arr[5][3]=maze.arr[5][5]=maze.arr[5][7]=maze.arr[5][8]= ' '; 37 maze.arr[6][0]=maze.arr[6][2]=maze.arr[6][4]=maze.arr[6][9]= '#'; 38 maze.arr[6][1]=maze.arr[6][3]=maze.arr[6][5]=maze.arr[6][6]=maze.arr[6][7]=maze.arr[6][8]= ' '; 39 maze.arr[7][0]=maze.arr[7][2]=maze.arr[7][7]=maze.arr[7][8]=maze.arr[7][9]= '#'; 40 maze.arr[7][1]=maze.arr[7][3]=maze.arr[7][4]=maze.arr[7][5]=maze.arr[7][6]= ' '; 41 maze.arr[8][0]=maze.arr[8][2]=maze.arr[8][7]=maze.arr[8][9]= '#'; 42 maze.arr[8][1]=maze.arr[8][3]=maze.arr[8][4]=maze.arr[8][5]=maze.arr[8][6]=maze.arr[8][8]= ' '; 43 maze.arr[9][0]=maze.arr[9][1]=maze.arr[9][2]=maze.arr[9][3]=maze.arr[9][4]=maze.arr[9][5]=maze.arr[9][6]=maze.arr[9][7]=maze.arr[9][8]=maze.arr[9][9]= '#'; 44 } 45 46 void InitMaze3(MazeType &maze) 47 { 48 maze.arr[0][0]=maze.arr[0][1]=maze.arr[0][2]=maze.arr[0][3]=maze.arr[0][4]=maze.arr[0][5]=maze.arr[0][6]=maze.arr[0][7]=maze.arr[0][8]=maze.arr[0][9]= '#'; 49 maze.arr[1][0]=maze.arr[1][2]=maze.arr[1][9]= '#'; 50 maze.arr[1][1]=maze.arr[1][3]=maze.arr[1][4]=maze.arr[1][5]=maze.arr[1][6]=maze.arr[1][7]=maze.arr[1][8]= ' '; 51 maze.arr[2][0]=maze.arr[2][2]=maze.arr[2][6]=maze.arr[2][7]=maze.arr[2][8]=maze.arr[2][9]= '#'; 52 maze.arr[2][1]=maze.arr[2][3]=maze.arr[2][4]=maze.arr[2][5]= ' '; 53 maze.arr[3][0]=maze.arr[3][2]=maze.arr[3][6]=maze.arr[3][9]= '#'; 54 maze.arr[3][1]=maze.arr[3][3]=maze.arr[3][4]=maze.arr[3][5]=maze.arr[3][7]=maze.arr[3][8]= ' '; 55 maze.arr[4][0]=maze.arr[4][2]=maze.arr[4][3]=maze.arr[4][4]=maze.arr[4][6]=maze.arr[4][9]= '#'; 56 maze.arr[4][1]=maze.arr[4][5]=maze.arr[4][7]=maze.arr[4][8]= ' '; 57 maze.arr[5][0]=maze.arr[5][4]=maze.arr[5][6]=maze.arr[5][9]= '#'; 58 maze.arr[5][1]=maze.arr[5][2]=maze.arr[5][3]=maze.arr[5][5]=maze.arr[5][7]=maze.arr[5][8]= ' '; 59 maze.arr[6][0]=maze.arr[6][2]=maze.arr[6][4]=maze.arr[6][9]= '#'; 60 maze.arr[6][1]=maze.arr[6][3]=maze.arr[6][5]=maze.arr[6][6]=maze.arr[6][7]=maze.arr[6][8]= ' '; 61 maze.arr[7][0]=maze.arr[7][2]=maze.arr[7][7]=maze.arr[7][9]= '#'; 62 maze.arr[7][1]=maze.arr[7][3]=maze.arr[7][4]=maze.arr[7][5]=maze.arr[7][6]=maze.arr[7][8]= ' '; 63 maze.arr[8][0]=maze.arr[8][2]=maze.arr[8][7]=maze.arr[8][9]= '#'; 64 maze.arr[8][1]=maze.arr[8][3]=maze.arr[8][4]=maze.arr[8][5]=maze.arr[8][6]=maze.arr[8][8]= ' '; 65 maze.arr[9][0]=maze.arr[9][1]=maze.arr[9][2]=maze.arr[9][3]=maze.arr[9][4]=maze.arr[9][5]=maze.arr[9][6]=maze.arr[9][7]=maze.arr[9][8]=maze.arr[9][9]= '#'; 66 } 67 68 void main() 69 { 70 MazeType maze; 71 InitMaze1(maze); 72 MazeType maze2; 73 InitMaze2(maze2); 74 MazeType maze3; 75 InitMaze3(maze3); 76 PosType s,e; 77 s.c = s.r = 1; 78 e.c = e.r = 8; 79 if(MazePath(maze,s,e)) 80 printf("迷宮成功解密!\n"); 81 else 82 printf("解密失敗\n"); 83 for (int i = 0; i < 10; i++) 84 { 85 for (int j = 0; j < 10; j++) 86 { 87 printf("%c ",maze.arr[i][j]); 88 } 89 printf("\n"); 90 } 91 if(MazePath(maze2,s,e)) 92 printf("迷宮成功解密!\n"); 93 else 94 printf("解密失敗\n"); 95 for (int i = 0; i < 10; i++) 96 { 97 for (int j = 0; j < 10; j++) 98 { 99 printf("%c ",maze2.arr[i][j]); 100 } 101 printf("\n"); 102 } 103 if(MazePath(maze3,s,e)) 104 printf("迷宮成功解密!\n"); 105 else 106 printf("解密失敗\n"); 107 for (int i = 0; i < 10; i++) 108 { 109 for (int j = 0; j < 10; j++) 110 { 111 printf("%c ",maze3.arr[i][j]); 112 } 113 printf("\n"); 114 } 115 }
參考《數據結構(C語言版)》嚴蔚敏著