小H喜欢睡觉(C语言实现)
小H十分喜欢睡觉,这天他起来一看,居然9.30了,而他答应了10点要到小W家去,小H想走知道小H到小W家的最短时间是多少,你能帮帮他吗。
地图是n * m的网格,每个单元是一个开放空间或建筑物(无法通过),小H的加在(1,1),小W 在(x,y)处,他只能上下左右移动,每一步需要1分钟。 输入数据可确保小W家可到达。
输入格式:
第一行具有两个正整数n,m,以空格(1 <= n,m <= 100)隔开,n为行,m为列
接下来是两个正整数x,y,用空格隔开(1 <= x <= n,1 <= y <= m)指示教学大楼的坐标
接下来是n行和m列的地图,0表示开放空间,1表示障碍物。
输出格式:
对于每个测试用例,输出一行包含整数的行,该行给出了小H到达小W家所需的最短时间(以分钟为单位)。
输入样例:
5 4
4 3
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
输出样例:
7
代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100
#define MAX_M 100
int n, m;
int x, y;
int grid[MAX_N][MAX_M];
int dist[MAX_N][MAX_M]; // 用于存储小H到每个位置的距离
// 计算从当前位置到目标位置的距离
int calculate_distance(int x, int y) {
int dx = abs(x - 1), dy = abs(y - 1);
return dx + dy;
}
// 找到从当前位置到小W家的最短距离
int shortest_distance() {
int min_distance = INT_MAX;
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= m; j++) {
if (grid[i][j] == 0) { // 如果当前位置是开放空间
min_distance = min(min_distance, calculate_distance(i, j));
}
}
}
return min_distance;
}
int main() {
scanf("%d %d", &n, &m);
scanf("%d %d", &x, &y);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
scanf("%d", &grid[i][j]);
}
}
dist[1][1] = shortest_distance(); // 从当前位置开始计算距离并存储到dist数组中
printf("%d\n", dist[n][m]); // 输出最短距离
return 0;
}
这段代码首先读入地图的大小、小H和小W的位置,以及地图的格子状态。然后使用一个二维数组dist
来存储小H到每个位置的距离,其中dist[i][j]
表示小H从位置(i, j)
到小W家的距离。在计算距离时,如果当前位置是开放空间,则将其与小H当前位置的距离进行比较,并更新最短距离。最后,输出最短距离即可。