数据结构-栈的实现之迷宫解密

迷宫求解核心思想:从入口出发,顺一个方向向前探索,走得通就继续向前走;否则沿原路退回并换一个方向继续探索,直到所有的路都走完为止。

还是用栈的先进后出的结构保存一路的路线。代码用到了之前写的栈的顺序实现数组格式那个结构。

并且修改和增加了些与迷宫有关的结构体,如下:

 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语言版)》严蔚敏著

 

posted @ 2016-04-23 12:18  A_book  阅读(5916)  评论(0编辑  收藏  举报