请用c语言写以下代码:用数组表示一个20*20的网格地图,并写一个路径冲突判断算法
时间: 2023-06-13 18:02:05 浏览: 212
以下是用C语言实现的代码,其中包括一个20*20的网格地图的二维数组和一个判断路径冲突的函数。
```c
#include <stdio.h>
#include <stdbool.h>
#define ROW 20
#define COL 20
int map[ROW][COL];
bool checkPath(int startX, int startY, int endX, int endY) {
// 判断起点和终点是否合法
if (startX < 0 || startX >= ROW || startY < 0 || startY >= COL
|| endX < 0 || endX >= ROW || endY < 0 || endY >= COL) {
printf("Invalid start or end position.\n");
return false;
}
// 判断是否走同一个点
if (startX == endX && startY == endY) {
printf("Start and end positions cannot be the same.\n");
return false;
}
// 判断起点和终点是否连通
if (map[startX][startY] == 0 || map[endX][endY] == 0) {
printf("Start or end position is blocked.\n");
return false;
}
// 判断路径是否冲突
int dx = endX - startX;
int dy = endY - startY;
int absDx = dx > 0 ? dx : -dx;
int absDy = dy > 0 ? dy : -dy;
int signDx = dx > 0 ? 1 : -1;
int signDy = dy > 0 ? 1 : -1;
if (absDx > absDy) {
// 沿x轴方向移动
int y = startY;
for (int x = startX + signDx; x != endX; x += signDx) {
if (map[x][y] == 0) {
printf("Path is blocked at (%d, %d).\n", x, y);
return false;
}
}
} else {
// 沿y轴方向移动
int x = startX;
for (int y = startY + signDy; y != endY; y += signDy) {
if (map[x][y] == 0) {
printf("Path is blocked at (%d, %d).\n", x, y);
return false;
}
}
}
return true;
}
int main() {
// 初始化地图
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
map[i][j] = 1;
}
}
// 设置障碍物
map[5][5] = 0;
map[5][6] = 0;
map[5][7] = 0;
// 测试路径冲突
printf("Checking path from (0, 0) to (5, 8)...\n");
checkPath(0, 0, 5, 8);
printf("Checking path from (5, 0) to (5, 8)...\n");
checkPath(5, 0, 5, 8);
printf("Checking path from (0, 0) to (5, 5)...\n");
checkPath(0, 0, 5, 5);
return 0;
}
```
以上代码中,我们通过一个二维数组来表示一个20*20的网格地图。数组中的每个元素都代表一个格子,如果该格子为1,则表示该位置可以通过,如果为0,则表示该位置被阻塞。
判断路径冲突的函数checkPath()接受起点和终点的坐标作为参数,首先判断起点和终点是否合法,然后判断起点和终点是否连通,最后根据路径的方向(沿x轴或y轴)逐一检查路径上的每个格子是否被阻塞。
在主函数中,我们设置几个障碍物,并分别测试了三条路径,其中第一条和第三条路径应该是合法的,而第二条路径应该是冲突的。
阅读全文