10×10 迷宮,0 通路,1 牆壁。從入口 (2,0) 走到邊界任意出口。用棧實現 DFS 回溯,記錄所有路徑並找出最短路徑。
Pos:座標結構體 {row, col}stack path :當前探索路徑stack minPath :最短路徑記錄maze[][]:0 未訪問,1 牆壁,2 已訪問continue 深入minPath 為空或當前路徑更短 → 更新 minPath = path
#define _CRT_SECURE_NO_WARNINGS
#include
#include
using namespace std;
#define N 10
struct Pos { size_t _row, _col; };
stack minPath; // 全局最短路徑
void InitMaze(int maze[][N], int size) {
FILE* fp = fopen("MazeMap.txt", "r");
if (!fp) { cout << "open fail\n"; exit(-1); }
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ) {
char ch = fgetc(fp);
if (ch == EOF) { cout << "init fail\n"; exit(-1); }
if (ch == '0' || ch == '1') {
maze[i][j] = ch - '0';
++j;
}
}
}
fclose(fp);
}
void DisplayMaze(int maze[][N], int size) {
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) cout << maze[i][j] << " ";
cout << endl;
}
cout << endl;
}
bool CheckAccess(int maze[][N], Pos next) {
return next._row < N && next._col < N && maze[next._row][next._col] == 0;
}
bool GetMazePath(int maze[][N], Pos entry, stack& path) {
path.push(entry);
maze[entry._row][entry._col] = 2;
while (!path.empty()) {
Pos cur = path.top();
// 到達邊界(出口)
if (cur._row == 0 || cur._row == N-1 || cur._col == 0 || cur._col == N-1) {
if (minPath.empty() || path.size() < minPath.size())
minPath = path; // 棧支持拷貝賦值
path.pop();
continue;
}
Pos next = cur;
// 嘗試 4 方向:上、下、左、右
next._row -= 1; // 上
if (CheckAccess(maze, next)) { path.push(next); maze[next._row][next._col] = 2; continue; }
next = cur; next._row += 1; // 下
if (CheckAccess(maze, next)) { path.push(next); maze[next._row][next._col] = 2; continue; }
next = cur; next._col -= 1; // 左
if (CheckAccess(maze, next)) { path.push(next); maze[next._row][next._col] = 2; continue; }
next = cur; next._col += 1; // 右
if (CheckAccess(maze, next)) { path.push(next); maze[next._row][next._col] = 2; continue; }
// 死路,回溯
path.pop();
}
return true; // 找完所有路徑
}
int main() {
int maze[N][N] = {0};
InitMaze(maze, N);
DisplayMaze(maze, N);
stack path;
Pos entry = {2, 0};
GetMazePath(maze, entry, path);
cout << "succeed to get out\n";
DisplayMaze(maze, N);
cout << "the shortest path is\n";
while (!minPath.empty()) {
cout << "<" << minPath.top()._row << "," << minPath.top()._col << "><-";
minPath.pop();
}
return 0;
}
fgetc 逐字符讀,跳過換行符minPath = path 記錄當前最優路徑DFS 非最優路徑搜索算法(不保證最先找到最短路)。本題規模小(10×10)可接受。大規模迷宮應用 BFS(保證最短步數)或 A* 算法。