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

 

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

参考资料:《数据结构(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 }

 

你可能感兴趣的:(数据结构)