
#include <cstdio> |
#include <cstdlib> |
#include <iostream> |
#include <cstring> |
using namespace std; |
#define INIT_SIZE 100 //存储空间初始分配量 |
#define SIZE_ADD 10 //存储空间分配增量 |
#define MAXLEN 10 //迷宫大小 |
struct Coord |
{ |
int r; |
int c; |
bool operator == (const Coord &b) const |
{ |
return (r==b.r && c==b.c); |
} |
}; |
struct Node |
{ |
int ord; |
Coord seat; |
int di; |
}; |
struct MazeType |
{ |
int r; |
int c; |
char map[MAXLEN][MAXLEN]; |
}; |
int dir[][2]={1,0, -1,0, 0,1, 0,-1}; |
bool flag; |
class Stack |
{ |
public: |
Stack () |
{ |
base = (Node *) malloc(INIT_SIZE * sizeof (Node)); |
if (!base) exit(0); |
top = base; |
size = INIT_SIZE; |
} |
bool empty () const { return top==base; } |
void pop(Node &e); |
void push(Node a); |
private: |
Node * top; |
Node * base; |
int size; |
}; |
void Stack::push(Node item) |
{ |
if (top - base >= size) |
{ |
base = (Node *) realloc(base, (size+SIZE_ADD)*sizeof(Node)); |
if (!base) exit(0); |
top = base + size; |
size += SIZE_ADD; |
} |
*top++ = item; |
} |
void Stack::pop(Node &e) |
{ |
if (top==base) return; |
e = * -- top; |
} |
void MadeMap (MazeType &maze) |
{ |
freopen ("test.in","r",stdin); |
flag = false; |
cin >> maze.r >> maze.c; |
for(int i=0; i<maze.r; i++) |
for(int j=0; j<maze.c; j++) |
scanf (" %c",&maze.map[i][j]); |
} |
Coord NextPos(Coord &curpos, int i) |
{ |
Coord ans; |
ans = curpos; |
ans.r += dir[i][0]; |
ans.c += dir[i][1]; |
return ans; |
} |
void MazePath(MazeType &maze, Coord start, Coord end) |
{ |
Stack S; |
Coord curpos; //当前坐标 |
Node e; |
curpos=start; |
int curstep=1; |
do |
{ |
if(maze.map[curpos.r][curpos.c]=='.') //此路可通 |
{ |
maze.map[curpos.r][curpos.c]='*'; |
e.ord=curstep; |
e.seat=curpos; |
e.di=1; |
S.push(e); |
if(curpos == end) |
{ |
flag = true; |
return; |
} |
curpos=NextPos(curpos,0); |
curstep++; |
} |
else |
{ |
if(!S.empty()) |
{ |
S.pop(e); |
while(e.di==3 && !S.empty()) |
S.pop(e); |
if(e.di < 4) |
{ |
e.di++; |
S.push(e); |
curpos=NextPos(e.seat,e.di); |
} |
} |
} |
}while(!S.empty()); |
} |
void PrintMaze(MazeType &maze) |
{ |
if (flag) |
{ |
cout << "迷宫路程图:\n"; |
for(int i=0;i<maze.r;i++) |
{ |
cout << " "; |
for(int j=0;j<maze.c;j++) |
printf("%2c",maze.map[i][j]); |
cout << endl; |
} |
} |
else |
cout << "\n***** 次迷宫无法从起点走到终点。 ******\n\n"; |
} |
int main() |
{ |
MazeType maze; |
Coord start,end; |
|
MadeMap (maze); |
start.r = start.c = 0; |
end.c = maze.c-1; |
end.r = maze.r-1; |
MazePath(maze, start, end); |
PrintMaze(maze); |
return 0; |
} |



