国际象棋跳跃问题 | 豆包MarsCode AI刷题

148 阅读3分钟

国际象棋跳跃问题 | 豆包MarsCode AI刷题

题目解析

今天是第三天打卡学习,我选择挑战“国际象棋跳跃问题”这个高难度的编程题。题目要求计算从初始坐标到目标坐标所需的最少步数。我需要同时考虑象和马的跳跃方式,用以模拟小U的移动。

思路解析

  1. 象的跳跃:可以移动到 (x+k,y+k)(x+k, y+k) 或 (x+k,y−k)(x+k, y-k),其中 kk 是任意整数。
  2. 马的跳跃:可以移动到 (x+a,y+b)(x+a, y+b),其中 ∣a∣+∣b∣=3且 1≤∣a∣,∣b∣≤2
  3. 广度优先搜索(BFS) :为了找到最短路径,我采用BFS算法进行搜索,确保每一步都是最优解。

代码详解

python

from collections import deque

def solution(x1: int, y1: int, x2: int, y2: int) -> int:
    if (x1, y1) == (x2, y2):
        return 0

    # 定义象和马的跳跃方式
    knight_moves = [
        (2, 1), (2, -1), (-2, 1), (-2, -1),
        (1, 2), (1, -2), (-1, 2), (-1, -2)
    ]
    
    # 使用队列进行BFS
    queue = deque([(x1, y1, 0)])  # (当前x, 当前y, 当前步数)
    visited = set((x1, y1))
    
    while queue:
        cx, cy, steps = queue.popleft()
        
        # Check if we can reach the target directly with an elephant move
        if abs(cx - x2) == abs(cy - y2):
            return steps + 1
        
        # 检查象的跳跃
        for k in range(1, max(abs(x2 - cx), abs(y2 - cy)) + 1):
            new_positions = [(cx + k, cy + k), (cx + k, cy - k), (cx - k, cy + k), (cx - k, cy - k)]
            for nx, ny in new_positions:
                if (nx, ny) == (x2, y2):
                    return steps + 1
                if (nx, ny) not in visited:
                    visited.add((nx, ny))
                    queue.append((nx, ny, steps + 1))
        
        # 检查马的跳跃
        for dx, dy in knight_moves:
            nx, ny = cx + dx, cy + dy
            if (nx, ny) == (x2, y2):
                return steps + 1
            if (nx, ny) not in visited:
                visited.add((nx, ny))
                queue.append((nx, ny, steps + 1))
    
    return -1  # 如果找不到路径

if __name__ == '__main__':
    print(solution(0, 0, 1, 1) == 1)
    print(solution(0, 0, 2, 1) == 1)
    print(solution(0, 0, 3, 3) == 1)
    print(solution(-3, -2, 2, 1) == 2)
    print(solution(16, 16, 15, 2) == 3)

知识总结

在使用豆包MarsCode AI刷题的过程中,我学到了以下重要的知识点:

  1. 广度优先搜索(BFS) :BFS算法是寻找最短路径的有力工具,特别适用于图和网格类问题。
  2. 象和马的跳跃方式:理解和实现象和马的移动规则,并将其应用于算法中,提高了我的数据结构和算法知识。
  3. 问题建模:通过将问题建模为图的搜索问题,帮助我更好地理解问题的本质和解决方法。

学习建议:对于入门同学,掌握BFS和DFS等基本搜索算法非常重要。可以通过不断练习和分析不同类型的题目,逐步积累经验,提高解题能力。

学习计划

结合豆包MarsCode AI刷题功能,我总结了以下高效学习方法:

  1. 制定刷题计划:每天坚持刷1-2道题目,逐步增加题目难度,确保知识点覆盖全面。
  2. 利用错题进行针对性学习:将错题整理成册,分析错误原因,找到知识盲点并针对性复习。
  3. 模拟考试环境:定期进行模拟考试,通过限时做题提高应对考场的能力和心理素质。

工具运用

将豆包MarsCode AI刷题功能与其他学习资源相结合,可以达到更好的学习效果:

  1. 在线文档和教程:结合在线教程和文档,进一步理解题目涉及的知识点。
  2. 编程练习平台:在各种编程练习平台上,寻找相似题目进行练习,以巩固所学知识。
  3. 讨论交流:加入编程学习社区,与其他学习者交流讨论,共同提高。

总结

高难度编程题其实再找对了方向和思路之后不比中难度难很多,在今后的学习中或许也可以多挑战一些高难度题目,理解阶梯过程和其中的精髓。ai工具只是辅助,重点还是锻炼自己的思维能力,共勉!