题目描述:
马是象棋(包括中国象棋和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称“马走‘日’字。
给顶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