Project Euler 185
Project Euler 185
题目
Number Mind
The game Number Mind is a variant of the well known game Master Mind.
Instead of coloured pegs, you have to guess a secret sequence of digits. After each guess you’re only told in how many places you’ve guessed the correct digit. So, if the sequence was $1234$ and you guessed $2036$, you’d be told that you have one correct digit; however, you would NOT be told that you also have another digit in the wrong place.
For instance, given the following guesses for a $5$-digit secret sequence,
90342 ;2 correct
70794 ;0 correct
39458 ;2 correct
34109 ;1 correct
51545 ;2 correct
12531 ;1 correct
The correct sequence $39542$ is unique.
Based on the following guesses,
5616185650518293 ;2 correct
3847439647293047 ;1 correct
5855462940810587 ;3 correct
9742855507068353 ;3 correct
4296849643607543 ;3 correct
3174248439465858 ;1 correct
4513559094146117 ;2 correct
7890971548908067 ;3 correct
8157356344118483 ;1 correct
2615250744386899 ;2 correct
8690095851526254 ;3 correct
6375711915077050 ;1 correct
6913859173121360 ;1 correct
6442889055042768 ;2 correct
2321386104303845 ;0 correct
2326509471271448 ;2 correct
5251583379644322 ;2 correct
1748270476758276 ;3 correct
4895722652190306 ;1 correct
3041631117224635 ;3 correct
1841236454324589 ;3 correct
2659862637316867 ;2 correct
Find the unique 16-digit secret sequence.
解决方案
本代码基于深度优先搜索寻找答案,枚举的内容是枚举线索中“未确定的正确数位组合”。实现时,使用了嵌套DFS。外层的DFS用于搜索每个线索;内层DFS属于组合枚举,用于寻找“未确定的正确数位组合”。
使用的优化如下:
- 将每条线索基于正确数量从小到大排序,避免一开始枚举组合的数量过大。
- 如果遍历到某条线索,发现正确数量太多,那么及时返回。
- 枚举某条线索的“未确定的正确数位组合”时,忽略那些目前是错误的或者是已经填数的数位。
本题也可以使用meet-in-the-middle思想,或者是模拟退火算法完成。
代码
1 |
|