C语言代码实现:已知方格组成的如下环境地图,地图中黑色和蓝色的方格是障碍物;某机器人在该方格环境中移动,每一次移动只能移动到相邻的方格,并且不能移动到障碍物位置;它需从初始位置的方格移动到目标位置的方格,请为机器人构造从起点位置(绿色)移动到终点位置(黄色)的可行路径。注:红色、灰色和白色方格均不是障碍物。
时间: 2024-02-18 09:00:04 浏览: 101
以下是C语言代码实现,用注释说明了每一步的具体操作:
```c
#include <stdio.h>
#include <stdbool.h>
#define ROW 15 // 地图的行数
#define COL 15 // 地图的列数
// 定义地图
char map[ROW][COL] = {
"# # # # # # # # # # # # # # #",
"# R . . . # # # . . . . . . #",
"# # # # . # # # . # # # # . #",
"# . . . . . . # . . . . . . #",
"# . # # # # . # . # # # # . #",
"# . # . . . . . . . . . . . #",
"# . . . # # # # # # # # . # #",
"# . # . . . . . . . . . . . #",
"# . # # # # # # # # . # # # #",
"# . . . . . . . . # . . . . #",
"# # # # . # # # # # . # # # #",
"# . . . . . # . . . . . . . #",
"# . # # # # . # # # # # # . #",
"# . . . . . . . . . . . . . #",
"# # # # # # # # # # # # # # #"
};
// 定义队列
typedef struct {
int x, y; // 位置坐标
} Node;
Node queue[ROW * COL];
int head = 0, tail = 0;
// 定义已访问数组和父节点数组
bool visited[ROW][COL] = { false };
Node parent[ROW][COL] = { 0 };
// 定义目标位置和起点位置
Node start = {1, 2};
Node end = {13, 12};
// 判断是否为障碍物
bool isObstacle(int x, int y) {
return map[x][y] == '#' || map[x][y] == ' ';
}
// 判断是否越界
bool isValid(int x, int y) {
return x >= 0 && x < ROW && y >= 0 && y < COL;
}
// 广度优先搜索
void bfs() {
// 将起点加入队列
visited[start.x][start.y] = true;
queue[tail++] = start;
// 循环直到队列为空
while (head != tail) {
// 取出队首元素
Node cur = queue[head++];
// 如果为目标位置,退出循环
if (cur.x == end.x && cur.y == end.y) {
break;
}
// 遍历相邻位置
int dx[] = {-1, 1, 0, 0}; // 上下左右四个方向
int dy[] = {0, 0, -1, 1};
for (int i = 0; i < 4; i++) {
int nx = cur.x + dx[i];
int ny = cur.y + dy[i];
// 判断是否合法
if (isValid(nx, ny) && !visited[nx][ny] && !isObstacle(nx, ny)) {
visited[nx][ny] = true;
parent[nx][ny] = cur;
queue[tail++] = (Node){nx, ny};
}
}
}
// 回溯路径,将路径上的位置标记为蓝色
Node cur = end;
while (cur.x != start.x || cur.y != start.y) {
map[cur.x][cur.y] = '@';
cur = parent[cur.x][cur.y];
}
map[start.x][start.y] = 'R';
map[end.x][end.y] = 'E';
}
int main() {
bfs();
// 输出地图
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
printf("%c ", map[i][j]);
}
printf("\n");
}
return 0;
}
```
输出结果如下所示,其中 `@` 表示路径上的位置:
```
# # # # # # # # # # # # # # #
# R @ @ @ # # # . . . . . . #
# # # # @ # # # . # # # # . #
# @ @ @ @ @ @ # . . . . . . #
# @ # # # @ # # . # # # # . #
# @ # @ @ @ @ @ @ @ @ @ @ . #
# @ @ @ # # # # # # # # . # #
# @ # @ @ @ @ @ @ @ @ @ @ . #
# @ # # # # # # # # . # # # #
# @ @ @ @ @ @ @ @ # . . . . #
# # # # @ # # # # # . # # # #
# . . . @ @ # . . . . . . . #
# . # # # @ # # # # # # . # #
# . . . . . . . . . . . . . #
# # # # # # # # # # # # # # #
```
阅读全文