国际象棋跳跃问题 | 豆包MarsCode AI刷题
题目解析
今天是第三天打卡学习,我选择挑战“国际象棋跳跃问题”这个高难度的编程题。题目要求计算从初始坐标到目标坐标所需的最少步数。我需要同时考虑象和马的跳跃方式,用以模拟小U的移动。
思路解析:
- 象的跳跃:可以移动到 (x+k,y+k)(x+k, y+k) 或 (x+k,y−k)(x+k, y-k),其中 kk 是任意整数。
- 马的跳跃:可以移动到 (x+a,y+b)(x+a, y+b),其中 ∣a∣+∣b∣=3且 1≤∣a∣,∣b∣≤2
- 广度优先搜索(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刷题的过程中,我学到了以下重要的知识点:
- 广度优先搜索(BFS) :BFS算法是寻找最短路径的有力工具,特别适用于图和网格类问题。
- 象和马的跳跃方式:理解和实现象和马的移动规则,并将其应用于算法中,提高了我的数据结构和算法知识。
- 问题建模:通过将问题建模为图的搜索问题,帮助我更好地理解问题的本质和解决方法。
学习建议:对于入门同学,掌握BFS和DFS等基本搜索算法非常重要。可以通过不断练习和分析不同类型的题目,逐步积累经验,提高解题能力。
学习计划
结合豆包MarsCode AI刷题功能,我总结了以下高效学习方法:
- 制定刷题计划:每天坚持刷1-2道题目,逐步增加题目难度,确保知识点覆盖全面。
- 利用错题进行针对性学习:将错题整理成册,分析错误原因,找到知识盲点并针对性复习。
- 模拟考试环境:定期进行模拟考试,通过限时做题提高应对考场的能力和心理素质。
工具运用
将豆包MarsCode AI刷题功能与其他学习资源相结合,可以达到更好的学习效果:
- 在线文档和教程:结合在线教程和文档,进一步理解题目涉及的知识点。
- 编程练习平台:在各种编程练习平台上,寻找相似题目进行练习,以巩固所学知识。
- 讨论交流:加入编程学习社区,与其他学习者交流讨论,共同提高。
总结
高难度编程题其实再找对了方向和思路之后不比中难度难很多,在今后的学习中或许也可以多挑战一些高难度题目,理解阶梯过程和其中的精髓。ai工具只是辅助,重点还是锻炼自己的思维能力,共勉!