当前位置: 首页 > 面试经验 >

2024年华为OD机试真题-跳马

优质
小牛编辑
68浏览
2024-07-26

2024年华为OD机试真题-跳马

华为OD机试真题-跳马-2024年OD统一考试(D卷)

题目描述:

马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。

给顶m行n列的棋盘(网格图),棋盘上只有有棋子象棋中的棋子“马”,并且每个棋子有等级之分,等级为k的马可以跳1~k步(走的方式与象棋中“马”的规则一样,不可以超出棋盘位置),问是否能将所有马跳到同一位置,如果存在,输出最少需要的总步数(每匹马的步数相加),不存在则输出-1。

注:允许不同的马在跳的过程中跳到同一位置,坐标为(x,y)的马跳一次可以跳到到坐标为(x+1, y+2), (x+1, y-2), (x+2, y+1), (x+2, y-1), (x-1, y+2), (x-1, y-2), (x-2, y+1), (x-2, y-1),的格点上,但是不可以超出棋盘范围。

输入描述:

第一行输入m,n代表m行n列的网格图棋盘(1 ≤ m, n ≤ 25);

接下来输入m行n列的网格图棋盘,如果第i行,第j列的元素为”.”代表此格点没有棋子,如果为数字k(1<=k<=9),代表此格点存在等级为k的“马”;

输出描述:

输出最少需要的总步数(每匹马的步数相加),不存在则输出-1。

补充说明:

示例1

输入:

3 2

..

2.

..

输出:

0

说明:

只有一匹马,不需要跳动

示例2

输入:

3 5

47.48

4744.

7....

输出:

17

说明:

解题思路:广度优先搜索

完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏

完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏

完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏

完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏

python代码:

def solve():
    # 读取允许的最大月数 M
    tim_top = int(input())
    # 读取每个需求的工作量列表,并转换为整数列表
    lis = list(map(int, input().split()))
    # 将工作量列表进行升序排序,便于后续处理
    lis.sort()
    # 设置二分搜索的左边界为列表中的最大值,因为这是完成所有任务的最小可能人力
    l = lis[-1]
    # 设置二分搜索的右边界为2*10^9,这是题目约定的人力上限
    r = int(2e9)
    # 初始化答案变量为人力上限
    ans = r
    # 进行二分搜索,寻找最小满足条件的人力配置
    while l <= r:
        # 计算中间值,代表当前尝试的人力配置
        mid = (l + r) // 2
        # 复制工作量列表,以便于操作
        tmp = lis.copy()
        # 初始化用于记录所需月份数的计数器
        tim = 0
        # 模拟按月分配任务
        while tmp:
            # 每次循环表示新的一个月开始,需求计数器加一
            tim += 1
            # 每月最多处理两个需求,先从列表中取出最大的需求
            b = tmp.pop()
            # 检查是否还有其他需求可以与之配对
            if tmp:
                p = -1  # 初始化配对需求的索引
                # 寻找一个需求,与b组合后总和不超过当前人力配置mid
                for i in range(len(tmp)):
                    if tmp[i] + b <= mid:
                        p = i
                # 如果找到了合适的需求,将其从列表中移除
                if p != -1:
                    tmp.pop(p)
        # 检查是否所有任务都可以在规定的月份数内完成
        if tim <= tim_top:
            # 如果可以,在当前的人力配置下满足条件,尝试减小人力配置
            ans = mid
            r = mid - 1
        else:
            # 如果不可以,增加人力配置,尝试更大的人力值
            l = mid + 1
    # 输出最小的满足所有任务的人力需求
    print(ans)
 
if __name__ == '__main__':
    solve()

完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏

完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏

完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏

完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏

Java代码:

import java.util.*; 
 
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scan
 类似资料: