第一行输入两个整数 � n 和 � m,表示这是一个 � × � n×m 的迷宫。 接下来的输入一个 � n 行 � m 列的迷宫。其中 'S' 表示蒜头君的位置,'*'表示墙,蒜头君无法通过,'.'表示路,蒜头君可以通过'.'移动,'T'表示迷宫的出口(蒜头君每次只能移动到四个与他相邻的位置——上,下,左,右)。 输出格式 输出整数,表示蒜头君逃出迷宫的最少步数,如果蒜头君无法逃出迷宫输出 − 1 −1。 数据范围 1 ≤ � , � ≤ 10 1≤n,m≤10。使用C++语言完成。
时间: 2023-06-09 19:06:29 浏览: 295
数据结构迷宫
我明白了,您想让我帮您解决一个迷宫问题。以下是我的代码实现:
```
#include<stdio.h>
#include<string.h>
#define MAX_N 10
#define MAX_M 10
#define INF 0x3f3f3f3f
char maze[MAX_N][MAX_M]; //迷宫地图
int N, M;
int sx, sy; //起点的坐标
int tx, ty; //终点的坐标
int d[MAX_N][MAX_M]; //记录各位置距离起点的最短距离
//四个方向移动的向量
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
//判断是否可以移动到(x,y)位置
int can_go(int x, int y) {
if (x < 0 || x >= N || y < 0 || y >= M)
return 0;
if (maze[x][y] == '*')
return 0;
return 1;
}
//bfs搜索最短路
int bfs() {
memset(d, INF, sizeof(d));
d[sx][sy] = 0;
int queue[MAX_N * MAX_M];
int head = 0, tail = 0;
queue[tail++] = sx * M + sy; //把起点加入队列
while (head < tail) { //队列不为空
int t = queue[head++]; //取出队首元素
int x = t / M, y = t % M; //解码坐标
if (x == tx && y == ty) //到达终点
return d[tx][ty];
for (int i = 0; i < 4; i++) { //四个方向尝试移动
int nx = x + dx[i], ny = y + dy[i];
if (can_go(nx, ny) && d[nx][ny] == INF) { //可以移动且没有被访问过
d[nx][ny] = d[x][y] + 1; //更新最短距离
queue[tail++] = nx * M + ny; //加入队列
}
}
}
return -1; //无法到达终点
}
int main() {
scanf("%d %d", &N, &M);
char ch;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
scanf(" %c", &ch);
if (ch == 'S') {
sx = i;
sy = j;
} else if (ch == 'T') {
tx = i;
ty = j;
}
maze[i][j] = ch;
}
}
int ans = bfs();
printf("%d\n", ans);
return 0;
}
```
在输入迷宫地图时,程序会记录起点和终点的坐标,并将路、墙等信息存储在地图数组中。程序使用bfs算法搜索最短路,遍历四个方向时,判断该位置是否可以移动以及是否被访问过。如果可以移动且未被访问过,就更新该位置距离起点的最短距离,并将该位置加入队列。最终程序输出蒜头君逃出迷宫的最少步数,如果无法逃出迷宫就输出-1。
阅读全文