小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当前位置的距离进行比较,并更新最短距离。最后,输出最短距离即可。

  • 10
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值