1 #include<iostream>
2 #include<fstream>
3 #include<stack>
4 #include<Windows.h>
5 using namespace std;
6 struct Position //定义坐标结构
7 {
8 int row, col;
9 };
10 class Maze
11 {
12 public:
13 void ReadTxt();
14 void DisplayMaze();
15 bool FindPath();
16 void WalkPath();
17
18 private:
19 int n;
20 int step;
21 int maze[100][100];
22 stack<Position> path;//定义路线堆栈
23 };
24
25 void Maze::ReadTxt()//读入txt文件
26 {
27
28 ifstream inFile;
29 inFile.open("maze.txt");
30 inFile>>n;
31 for(int i=0;i<n;i++)
32 for(int j=0;j<n;j++)
33 inFile>>maze[i][j];
34 inFile.close();
35 }
36
37 void Maze::DisplayMaze()//打印原始迷宫
38 {
39 for(int i=0;i<n;i++)
40 {
41 for(int j=0;j<n;j++)
42 {
43 if((i==1&&j==0)||(i==n-2&&j==n-1))
44 cout<<"=>";
45 else if(maze[i][j]==1)
46 cout<<"##";
47 else cout<<" ";
48 }
49 cout<<endl;
50 }
51 }
52 bool Maze::FindPath()//找到路线并显示,无则给出“no path”信息
53 {
54 bool IfPath=true;
55 Position offset[4];
56 offset[0].row = 0; offset[0].col = 1; // 右
57 offset[1].row = 1; offset[1].col = 0; // 下
58 offset[2].row = 0; offset[2].col = -1; // 左
59 offset[3].row = -1; offset[3].col = 0; // 上
60
61 int a[100][100];
62 for(int i=0;i<n;i++)
63 for(int j=0;j<n;j++)
64 a[i][j]=maze[i][j];
65 Position here;
66 here.row = 1;
67 here.col = 0;
68 a[1][0] = 1; // 避免返回起点
69
70 int option = 0; // 下一动作的方向
71 int LastOption = 3;
72
73 while (here.row != (n-2) || here.col != (n-2)) //循环直到到达终点
74 {
75 int r,c;
76 while (option <= LastOption) //找到下一动作的方向
77 {
78 r = here.row + offset[option].row;
79 c = here.col + offset[option].col;
80 if (a[r][c] == 0) break;
81 option++; // 切换下一方向
82 }
83
84 if (option <= LastOption) //如果下一动作可行,即有一个方向可行
85 {
86 path.push(here);//将此刻的位置压入栈中
87 here.row = r;
88 here.col = c;
89 a[r][c] = 1;//将此刻的位置设为不可行
90 option = 0;//将option归零
91 }
92 else //如果下一动作不可行,回溯
93 {
94 if(path.empty()) {IfPath= false;break;}//堆栈空,不可回溯,无解
95 Position next=path.top();//弹出堆栈,设置option
96 path.pop();
97 if (next.row == here.row)
98 option = 2 + next.col - here.col;
99 else option =3+ next.row - here.row;
100 here = next;
101 }
102 }
103 if(IfPath==true)
104 {
105 int step=0;
106 Position a;
107 a.row=n-2;a.col=n-2;
108 path.push(a);
109 stack<Position> tmp;
110 while(!path.empty ())
111 {
112 tmp.push(path.top());
113 path.pop();
114 }
115 while(!tmp.empty())
116 {
117 cout<<'('<<tmp.top().row<<','<<tmp.top().col<<')'<<"->";
118 path.push(tmp.top());
119 tmp.pop();
120 step++;
121 }
122 cout<<endl<<"the number of the total steps: "<<step<<endl;
123 }
124 else cout<<"no path"<<endl;
125 return IfPath;
126 }
127 void Maze::WalkPath()//动态显示
128 {
129 stack<Position> tmp;
130
131 while(!path.empty ())
132 {
133 tmp.push(path.top());
134 path.pop();
135 }
136
137 while(!tmp.empty())
138 {
139 system("cls");
140 for(int i=0;i<n;i++)
141 {
142 for(int j=0;j<n;j++)
143 {
144 if((i==1&&j==0)||(i==n-2&&j==n-1))
145 cout<<"=>";
146 else if(i==tmp.top().row&&j==tmp.top().col)
147 {
148 cout<<"◆";
149 }
150 else if(maze[i][j]==1)
151 cout<<"##";
152 else cout<<" ";
153 }
154 cout<<endl;
155 }
156 path.push(tmp.top());
157 tmp.pop();
158 Sleep(250);
159 }
160 }
161 #include<iostream>
162 #include<Windows.h>
163 #include<conio.h>
164 using namespace std;
165 int main()
166 {
167 Maze maze1;
168 maze1.ReadTxt();
169 maze1.DisplayMaze();
170 bool t=maze1.FindPath();
171
172 if(t==1)
173 {
174 char s;
175 cout<<endl<<"按任意键开始动态显示迷宫路径."<<endl;
176 getch();
177 maze1.WalkPath();
178 }
179 system("pause");
180 return 0;
181 }