Lazy loaded image
第七题 题目理解
Words 648Read Time 2 min
2025-5-29

✅ Part 1:理解 count_positions(moves, depth) 的含义与思路


🧠 它在解决什么问题?

你要模拟一个棋局从当前状态出发,向下推演 depth 步,统计一共可以有多少种不同的棋局发展可能。
换句话说,从当前的 moves 走法开始,每一步都展开出所有可能的下一步,然后继续对每一个可能,再展开,直到总共走了 depth 步。最后统计一共走出了多少条合法的“走法路径”。

🌳 举个例子理解

假设你是从初始局面出发(moves=[]),也就是还没有开始走棋:
  • 第 1 步,你可以选择 20 种不同的第一步(比如 e4、d4、Nf3 等),那么深度为 1 时的结果就是 20
  • 每一个第一步之后,对手可以有多个回应(比如你走 e4,对手可以走 e5、c5、d6...),每种回应又可以带来新局面。
  • 所以你如果要看 depth=2,就要考虑:20 种第一步 × 每种第一步后所有可能的回应 —— 结果总共是 400 种局面。
这样随着 depth 增加,可能的局面数呈指数级增长。

🔁 这是一种“树形递归”的计算过程

想象一个“棋局发展树”:
  • 每个节点是一个棋局状态(由 moves 代表)
  • 每条边是一次合法走法
  • 每个节点都可以继续展开新的合法走法形成子节点
你做的,就是从根节点(初始走法)出发,向下生长这棵树,直到深度等于 depth 为止,统计所有叶子节点的数量。

🧩 最底层的判断逻辑

  • 如果 depth == 0,意思是“我已经达到了目标深度”,那么当前路径就是一个完整的合法局面,记作 1 个
  • 否则,你就要找出当前 moves 所能产生的所有合法的“下一步走法组合”,然后对每一个组合再递归计算它在剩下深度中的所有可能路径。
  • 最终你把所有这些子路径的数量加起来,就是以当前 moves 为起点、depth 步棋之后的总局面数

🧩 总结理解

项目
内容
Task 7 Part 1
构建棋局展开树,从当前局面出发,统计所有 depth 步合法路径数量(无数据库)
Task 7 Part 2
遍历真实棋局数据,寻找在开局 depth 步内白方胜率最高、并且常见的走法序列(基于数据库)
共通点
都是围绕“从某个状态往下展开走法”的递归遍历问题
区别点
Part 1 是理论树结构;Part 2 是从真实历史棋局数据中分析的统计树结构