数据结构-栈的实现之迷宫解密
迷宫求解核心思想:从入口出发,顺一个方向向前探索,走得通就继续向前走;否则沿原路退回并换一个方向继续探索,直到所有的路都走完为止。
还是用栈的先进后出的结构保存一路的路线。代码用到了之前写的栈的顺序实现数组格式那个结构。
并且修改和增加了些与迷宫有关的结构体,如下:
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语言版)》严蔚敏著