數據結構-棧的實現之迷宮解密


迷宮求解核心思想:從入口出發,順一個方向向前探索,走得通就繼續向前走;否則沿原路退回並換一個方向繼續探索,直到所有的路都走完為止。

還是用棧的先進后出的結構保存一路的路線。代碼用到了之前寫的棧的順序實現數組格式那個結構。

並且修改和增加了些與迷宮有關的結構體,如下:

 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語言版)》嚴蔚敏著

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM