迷宫求解(数据结构栈应用)

 

 数据结构课作业。--------

参考资料:《数据结构(C语言版)》严蔚敏 吴伟民 编著;

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <iostream>
  4 #include <cstring>
  5 using namespace std;
  6 
  7 #define INIT_SIZE 100 //存储空间初始分配量
  8 #define SIZE_ADD 10  //存储空间分配增量
  9 #define MAXLEN 10   //迷宫大小
 10 
 11 struct Coord
 12 {
 13       int r;
 14       int c;
 15       bool operator == (const Coord &b) const
 16       {
 17         return (r==b.r && c==b.c);
 18       }
 19 };
 20 
 21 struct Node
 22 {
 23        int  ord;
 24        Coord seat;
 25        int  di;
 26 };
 27 struct MazeType
 28 {
 29        int r;
 30        int c;
 31        char map[MAXLEN][MAXLEN];
 32 };
 33 int dir[][2]={1,0, -1,0, 0,1, 0,-1};
 34 bool flag;
 35 
 36 class Stack
 37 {
 38     public:
 39         Stack ()
 40         {
 41             base = (Node *) malloc(INIT_SIZE * sizeof (Node));
 42                 if (!base) exit(0);
 43             top = base;
 44             size = INIT_SIZE;
 45         }
 46         bool empty () const { return top==base; }
 47         void pop(Node &e);
 48         void push(Node a);
 49 
 50     private:
 51         Node * top;
 52         Node * base;
 53         int size;
 54 };
 55 
 56 void Stack::push(Node item)
 57 {
 58     if (top - base >= size)
 59     {
 60         base = (Node *) realloc(base, (size+SIZE_ADD)*sizeof(Node));
 61         if (!base) exit(0);
 62         top = base + size;
 63         size += SIZE_ADD;
 64     }
 65     *top++ = item;
 66 }
 67 
 68 void Stack::pop(Node &e)
 69 {
 70     if (top==base) return;
 71     e = * -- top;
 72 }
 73 
 74 void MadeMap (MazeType &maze)
 75 {
 76 
 77     freopen ("test.in","r",stdin);
 78     flag = false;
 79     cin >> maze.r >> maze.c;
 80         for(int i=0; i<maze.r; i++)
 81               for(int j=0; j<maze.c; j++)
 82                    scanf (" %c",&maze.map[i][j]);
 83 }      
 84 
 85 
 86 Coord NextPos(Coord &curpos, int i)
 87 {
 88 
 89       Coord ans;
 90       ans = curpos;
 91       ans.r += dir[i][0];
 92       ans.c += dir[i][1];
 93       return ans;
 94 }
 95 
 96 
 97 void MazePath(MazeType &maze, Coord start, Coord end)
 98 {
 99       Stack S;
100       Coord curpos;  //当前坐标
101       Node e;
102 
103       curpos=start;
104       int curstep=1;
105 
106       do
107       {    
108          if(maze.map[curpos.r][curpos.c]=='.')  //此路可通
109          {
110              maze.map[curpos.r][curpos.c]='*';
111 
112              e.ord=curstep;
113              e.seat=curpos;
114              e.di=1;
115 
116              S.push(e);
117              if(curpos == end)
118              {
119                  flag = true;
120                  return;
121             }
122              curpos=NextPos(curpos,0);
123              curstep++;                        
124           }
125           else
126           {
127                if(!S.empty())
128                {
129                     S.pop(e);
130                     while(e.di==3 && !S.empty())
131                           S.pop(e);
132                     if(e.di < 4)
133                   {
134                          e.di++;
135                          S.push(e);            
136                          curpos=NextPos(e.seat,e.di);
137                     }
138                  }
139              }
140        }while(!S.empty());
141 }
142 
143 void PrintMaze(MazeType &maze)
144 {
145 
146      if (flag)
147      {
148          cout << "迷宫路程图:\n";
149          for(int i=0;i<maze.r;i++)
150          {
151             cout << "      ";
152             for(int j=0;j<maze.c;j++)
153                 printf("%2c",maze.map[i][j]);
154             cout << endl;
155          }
156       }
157       else
158           cout << "\n*****    次迷宫无法从起点走到终点。   ******\n\n";
159 }
160 
161 int main()
162 {
163 
164     MazeType maze;
165     Coord start,end;
166        
167     MadeMap (maze);
168 
169     start.r = start.c = 0;
170     end.c = maze.c-1;
171     end.r = maze.r-1;
172 
173     MazePath(maze, start, end);
174     PrintMaze(maze);
175     return 0;
176 }

 

posted @ 2014-11-12 13:26  无道圣君  阅读(1266)  评论(0编辑  收藏  举报