# ♟️ 奇偶棋子谜题 (Parity Chess Puzzle)

本项目将国际象棋棋盘上的奇偶性数学奥数解答题（源自 `chessincube.jpg`）打造成了一款交互式 HTML5 网页益智解谜游戏，已全面适配手机触摸屏、iPad 平板与 PC 高分辨率大屏。

---

## 📖 题目背景与数学问题

**原题描述**：
> 今有一个 6×6 的国际象棋棋盘，在其中放入一些棋子（每格最多放 1 枚），使得每行都有偶数（>0）枚棋子，每列都有奇数枚棋子，那么至少需要放入多少枚棋子？说明理由且给出构造方案。

---

## 📐 深度数学解答：这道题不管 n 是多少都是 2n 吗？

**结论：并不是对任意的 $n$ 都是 $2n$！**
只有当 **$n$ 为大于等于 4 的偶数**时，答案才严格是 **$2n$**；在其他情况下，数学上根本无解。

### 1. 当 $n$ 为奇数时（如 $n = 1, 3, 5, 7, \dots$）$\implies$ **数学上彻底无解！**
- **行和奇偶性**：每行偶数枚，各行之和必为偶数（总棋子数 $S$ 必为偶数）；
- **列和奇偶性**：每列奇数枚，全盘有 $n$ 列，**奇数个奇数相加的总和必为奇数**（总棋子数 $S$ 必为奇数）；
- **矛盾**：整数 $S$ 不可能既是偶数又是奇数，因此任何奇数阶棋盘都绝对无解。

### 2. 当 $n = 2$ 时 $\implies$ **无解！**
- 若 $n = 2$，每行偶数（$>0$），则每行至少 2 枚，总棋子数至少 4 枚，全盘 4 格必须全部填满；
- 全部填满后，两列棋子数均为 2 枚（偶数），违背了“每列奇数枚”的要求；拿掉任何棋子则某行不足 2 枚违规。因此 $n = 2$ 也无解。

### 3. 当且仅当 $n$ 为偶数且 $n \ge 4$ 时（如 $n = 4, 6, 8, 10, \dots$）$\implies$ **答案严格是 $2n$！**
- **下界推导**：每行大于 0 的偶数至少是 2 枚，共有 $n$ 行，总棋子数 $S \ge 2 \times n = 2n$；
- **显式构造**：将 $n$ 列拆分为两半（前 $n/2$ 列每列放 3 枚，后 $n/2$ 列每列放 1 枚），列和总数为 $(n/2)\times3 + (n/2)\times1 = 2n$；
- 通过前半区循环连边与后半区一一映射的环形配对算法，每一行恰好得到 2 枚棋子，严格达成 $2n$ 理论极限。

### 📊 任意阶 $n$ 总结对照表

| 棋盘规模 $n$ | 是否有解 | 最少棋子数 | 理由说明 |
| :--- | :--- | :--- | :--- |
| **$n = 1$** | ❌ 无解 | — | 行和偶数与列和奇数守恒矛盾 |
| **$n = 2$** | ❌ 无解 | — | 行满时两列各2枚(偶数)，无法满足列奇 |
| **$n = 3$** | ❌ 无解 | — | 3个奇数列之和为奇数，与行偶矛盾 |
| **$n = 4$** | ✅ 有解 | **8** 枚 ($2n$) | 前2列各3枚，后2列各1枚，每行2枚 |
| **$n = 5$** | ❌ 无解 | — | 5个奇数列之和为奇数，与行偶矛盾 |
| **$n = 6$ (原题)** | ✅ 有解 | **12** 枚 ($2n$) | 前3列各3枚，后3列各1枚，每行2枚 |
| **$n = 8$** | ✅ 有解 | **16** 枚 ($2n$) | 前4列各3枚，后4列各1枚，每行2枚 |
| **任意偶数 $n \ge 4$** | ✅ 有解 | **$2n$** 枚 | 分块循环矩阵确定性构造解均存在 |

---

## 🧩 构造算法详解：分块循环矩阵与三重数学保证

很多解谜者会产生疑问：“如何用合理算法保证一定能放下且每格最多放 1 枚棋子？”
我们所实现的构造算法基于**分块矩阵代数模型**，可严格证明对任意偶数 $n \ge 4$ 均 $100\%$ 合法成立。

### 1. 矩阵数学模型
令 $k = n / 2$（由于 $n \ge 4$，故 $k \ge 2$）。将 $n \times n$ 棋盘划分为 4 个 $k \times k$ 子矩阵：
$$A = \begin{pmatrix} I_k + P_k & \mathbf{0}_{k \times k} \\ I_k & I_k \end{pmatrix}$$
其中 $I_k$ 为 $k$ 阶单位矩阵，$P_k$ 为循环向右平移 1 位的置换矩阵。

### 2. 坐标落子通式（代码生成公式）
- **上半区（第 $0 \le r < k$ 行）**：
  每行放入 2 枚棋子，列坐标为：
  $$c_1 = r, \quad c_2 = (r + 1) \bmod k$$
- **下半区（第 $k \le r < n$ 行，设 $i = r - k$）**：
  每行放入 2 枚棋子，列坐标为：
  $$c_1 = i, \quad c_2 = k + i$$

### 3. 三重数学保证（为什么保证能放下？）
- **保证一：单元格零重叠（每格最多 1 枚）**
  - 在上半区：因 $k \ge 2$，$(r+1) \bmod k \ne r$ 恒成立，因此同一行内的两枚棋子列坐标绝不相同；
  - 在下半区：两列分别为 $i$ 与 $k+i$，因 $k \ge 2 > 0$ 显然 $i \ne k+i$，两列绝不相同；
  - 上半区行号集合 $\{0, \dots, k-1\}$ 与下半区行号集合 $\{k, \dots, 2k-1\}$ 互不相交；
  - **结论**：每个格点的值均为 0 或 1，不存在任何单元格重叠冲突。
- **保证二：每行严格为 2 枚（满足偶数 > 0）**
  - 上半区由 $I_k + P_k$ 贡献 2 枚，零矩阵贡献 0 枚，行和 $= 2 + 0 = 2$；
  - 下半区由左下 $I_k$ 贡献 1 枚，右下 $I_k$ 贡献 1 枚，行和 $= 1 + 1 = 2$；
  - **结论**：全部 $n$ 行的棋子数严格全等于 2 枚。
- **保证三：每列奇数且完全能容纳（列容量充裕不溢出）**
  - 前 $k$ 列在上半区分到 2 枚、下半区分到 1 枚，列和为 $2+1=3$ 枚（正奇数）；
  - 后 $k$ 列在上半区分到 0 枚、下半区分到 1 枚，列和为 $0+1=1$ 枚（正奇数）；
  - **列容量检验**：棋盘单列总高度为 $n$。因为 $n \ge 4$，所以列高度 $n \ge 4 > 3$！列最多只需要放 3 枚棋子，每列至少还余出 $n - 3 \ge 1$ 个空格，不仅能放下，而且空间充裕！

### 4. $6 \times 6$ 原题 0-1 矩阵直观图解
```text
           列1 列2 列3 | 列4 列5 列6
        ----------------------------
行1 (r=0):  1   1   0  |  0   0   0   -> 行和 = 2 (偶数)
行2 (r=1):  0   1   1  |  0   0   0   -> 行和 = 2 (偶数)
行3 (r=2):  1   0   1  |  0   0   0   -> 行和 = 2 (偶数)
        ---------------------------- (分界线：上半区 C_3 | 0)
行4 (i=0):  1   0   0  |  1   0   0   -> 行和 = 2 (偶数)
行5 (i=1):  0   1   0  |  0   1   0   -> 行和 = 2 (偶数)
行6 (i=2):  0   0   1  |  0   0   1   -> 行和 = 2 (偶数)
        ---------------------------- (分界线：下半区 I_3 | I_3)
列和:       3   3   3  |  1   1   1   (全为奇数！总和 12 枚严格极小)
```

---

## 📱 多端适配与大屏尺寸调节

针对不同设备和高分辨率显示器做了深度优化：
1. **PC 电脑高分屏（1080p、2K、4K屏）**：
   - 顶部工具栏提供【棋盘尺寸】调节按钮：**标准** / **加大 (推荐)** / **特大**；
   - 支持将单格尺寸从默认 64px 放大至 82px 乃至 100px（全盘达 600px+ 宽度），棋子、数字徽章与状态指示等比清晰放大，拒绝“太小看不清”。
2. **iPad / 平板屏幕（600px ~ 1024px）**：
   - 居中自适应布局，单格尺寸针对手指点触优化（58px~68px），操作舒适不拥挤。
3. **智能手机竖屏（< 600px）**：
   - 棋盘根据视口宽度纯动态实时算力缩放（`computeCellSize`），行标与列指示不遮挡、不换行；
   - 消除横向滚动条，支持触摸高亮反馈与原生缩放兼容。

---

## 🎮 游戏操作与解题工具

- **点击格子**：放置或拿取木质棋子。
- **动态奇偶指示**：行尾和列头即时显示实时计数与 `✓`/`×` 状态。
- **↩ 撤销 / ↪ 重做 / 🗑️ 清空**：随时回退尝试。
- **💡 智能提示**：结合数学构造法指出下一步最优操作。
- **✨ 演示官方最优解**：带逐步动画落子演示。
- **📖 查看数学原理解析**：弹窗展示包含奇数无解、n=2无解和 $n \ge 4$ 的完整证明。

---

## 🧪 自动化测试运行

```powershell
# 运行 Python 单元测试 (pytest)
python -m pytest tests/test_stones_parity_puzzle.py

# 运行 JavaScript 单元测试 (Node.js)
node --test stones/solver.test.js
```
