给定一个大小为NxM的迷宫。迷宫有通道和墙壁组成,每一步可以向邻接的上下左右四格通道移动。请求从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点,其中
样例:
N=10,M=10 (‘#’,’.’,’S’,’G’分别表示墙壁、通道、起点和终点)
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
输出:
22
提示:为便于测试和修改,迷宫数据可以采用文本文件的形式进行保存,程序运行时从文件读入。
程序代码及测试结果:
#include
using namespace std;
char map[10][10] = {0};
int flag[10][10] = {0}; //0为未访问,1为已访问
void dfs(int x, int y, int step);
int Min = 100;
int main() {
int M, N;
int i, j, x, y, step = 0;
cin >> M >> N;
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
cin >> map[i][j];
}
cout << endl;
}
for (i = 0; i < N; i++) {
for (j = 0; j < M; j++) {
if (map[i][j] == 'S') {
x = i;
y = j;
}
}
}
flag[x][y] = 1;
dfs(x, y, step);
printf("%d", Min);
return 0;
}
void dfs(int x, int y, int step) {
if (map[x][y] == 'G') {
if (step < Min)
Min = step;
return;
}
if (map[x - 1][y] != '#' && flag[x - 1][y] == 0 && x - 1 >= 0) {
flag[x - 1][y] = 1;
dfs(x - 1, y, step + 1);
flag[x - 1][y] = 0;
}
if (map[x + 1][y] != '#' && flag[x + 1][y] == 0 && x + 1 <= 9) {
flag[x + 1][y] = 1;
dfs(x + 1, y, step + 1);
flag[x + 1][y] = 0;
}
if (map[x][y - 1] != '#' && flag[x][y - 1] == 0 && y - 1 >= 0) {
flag[x][y - 1] = 1;
dfs(x, y - 1, step + 1);
flag[x][y - 1] = 0;
}
if (map[x][y + 1] != '#' && flag[x][y + 1] == 0 && y + 1 <= 9) {
flag[x][y + 1] = 1;
dfs(x, y + 1, step + 1);
flag[x][y + 1] = 0;
}
return;
}
2022/5/15
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)