题目:小明五次输入四位数的手机密码分别是:6087. 5173. 1358. 3825. 2531,均错误,但是每次输入的密码中有两位数字正确,位置都不对。现求小明正确四位数手机密码?最后总结解题思路步骤。
**答案:手机密码为 **`8712`**
---
## 1. 把题目转换成数学问题
- 每个猜测(四位数)与真正的密码共有 **两位数字相同**,
- 但这两位数字在各自的位置上都不对应。
- 密码里的每一位数字均来自 0‑9 的十进制数字;题目里出现的数字只有
```
{0,1,2,3,5,6,7,8}
```
(4、9 没出现过,显然不可能是密码的一部分)。
---
## 2. 找出“可能的四个数字”集合
设真正密码为 **S = {a,b,c,d}**。
对每一次猜测,恰好有两位数来自 S,另外两位不是。
因此:
```
∑_{x∈S} 在所有 5 次猜测中出现的次数 = 5×2 = 10
```
先统计题目里各个数字在五次猜测中的出现次数(记为 “频数”):
| 数字 | 频数 |
|------|------|
|0 | 1 |
|1 | 3 |
|2 | 2 |
|3 | 3 |
|5 | 4 |
|6 | 1 |
|7 | 2 |
|8 | 3 |
于是 S 的四个数字的频数之和必须是 **10**。
在 C(8,4)=70 个组合中,满足“频数之和=10”的集合只有下面几组:
```
{0,1,2,5} {0,1,3,8} … (共 20 组)
```
---
## 3. 检验每个候选集合是否满足“**每次猜测恰好有两位数相同**”
我们把上述 20 组逐一与五次猜测的数字集比较,寻找 **所有猜测都出现正好两个交叉元素** 的集合。
最终发现唯一符合条件的是
```
S = {1, 2, 7, 8}
```
验证示例(仅给出第一行):
- 猜测 `6087` 与 S 的交集为 `{8,7}`,恰好两个数字。
- 同理对其余四次猜测均满足这一要求。
---
## 4. 确定 **具体排列**(位置)
现在知道密码是这四个数字,但还未确定它们的顺序。
进一步利用“两位数在各自位置上都不对应”的限制:
| 猜测 | 正确的两位数字 | 这些数字在猜测中的位置 | 对密码中相应位置的禁用条件 |
|------|----------------|------------------------|---------------------------|
|6087 | 8,7 | 3,4 | `s3≠8`, `s4≠7` |
|5173 | 1,7 | 2,3 | `s2≠1`, `s3≠7` |
|1358 | 1,8 | 1,4 | `s1≠1`, `s4≠8` |
|3825 | 8,2 | 2,3 | `s2≠8`, `s3≠2` |
|2531 | 2,1 | 1,4 | `s1≠2`, `s4≠1` |
把所有条件列出来后,逐步排除不可能的位置:
- 由于 **8** 在所有猜测中都不能位于其原位置(3、2、4),唯一可行的是放在第 **1** 位。
- 于是 `s1 = 8`。
剩下的数字 {1,2,7} 需要填入位置 2、3、4,满足:
```
s2 ≠ 1 , s2 ≠ 8 → s2 ∈ {2,7}
s3 ≠ 8 , s3 ≠ 2 → s3 ∈ {1,7}
s4 ≠ 7 , s4 ≠ 8 → s4 ∈ {1,2}
```
尝试组合:
- 若 `s2 = 2`,则 `s3=7`, `s4=1`;但 G5 的两位数字(2、1)会与猜测中的位置相同 → **不行**。
- 于是设 `s2 = 7`。
剩余 {1,2} 必须放在 s3 和 s4:
- `s3 = 1`, `s4 = 2`
验证所有限制都通过,且每一次猜测的两位数字均不与原位置对应。
---
## 5. 最终答案
```
手机密码 = 8712
```
### 验证
| 猜测 | 正确数字 | 位置是否相同 |
|------|----------|--------------|
|6087 | 8,7 | 均不同 |
|5173 | 1,7 | 均不同 |
|1358 | 1,8 | 均不同 |
|3825 | 8,2 | 均不同 |
|2531 | 2,1 | 均不同 |
满足题目所有条件。
---
## 总结思路与步骤
1. **统计频数**:把每个数字在五次猜测中的出现次数记录下来。
2. **利用总和约束**:密码四位数的频数之和必为 10,缩小候选集合。
3. **交集验证**:检查候选集合与每次猜测的交集大小是否都恰好是 2。
4. **确定排列**:把“相同位置不对”转化成一系列“不能放的位置”,逐步排除,最终得到唯一排列。
这样即可在不枚举所有 10⁴ 个密码的前提下,用逻辑推理快速求解。