Any other solutions to the MineSweeperMaster in Google code jam 2014 qualification round?
以下是我的解决方案,但它只解决了问题。我希望我能看到一些好的解决方案,它们使用一些动态编程或其他算法(蛮力除外)来尝试将 0 单元格放入板中。
以下是我的算法步骤:
1 | set remains = r * c - m. |
1) m = 0:都是自由空间。打印"。"在所有单元格中,然后
用"c"覆盖任何单元格。
2) 仍然 = 1:同样的想法,.在所有单元格中打印"*",然后覆盖
任何带有"c"的单元格。
3) 如果 r==1 或 c==1:解决方案在前 m 个单元格中放置"*",在第一个单元格中放置"c"
最后一个单元格,其他单元格是"."
(交换案例4)和5)。感谢@TheComputerGuy 的评论。)
4) 在其他情况下,如果剩余数为 2、3、5、7,则"不可能"。其他:
5) 如果 r==2 或 c==2:
如果 m % 2==0,则有解决方案:在前 m/2 列中或
行是"*",最后一个单元格是"c",其他单元格是"."
如果 m % 2 == 1,"不可能"。
6) 从 (0,0) 开始,从左到右,从上到下,逐行填充地雷。
需要考虑特殊情况:
设置 rs = m / c; cs = m % c
6.1) 如果 rs < r - 2,并且 cs < c - 1,则填充好,并将"c"放在最后一个单元格中,
其他单元格是"."
1 2 3 4 5 6 7 | ********** ********** ********** ********** ****...... .......... .......... |
6.2) 如果 rs < r -3 且 cs == c -1,则将一个地雷移至下一行的开头。 (本案)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ********** ********** ********** *********.(not work here) .......... .......... .......... (Final solution) ********** ********** ********** ********..(Move a * to the next row and put a space here) *......... .......... .........c |
6.3) 如果 rs == r - 3 和 cs == c -1,则将两个地雷移动到两行的开头
1 2 3 4 5 6 7 8 9 10 11 12 13 | ********** ********** ********** *********.(not work here) .......... .......... (Final solution) ********** ********** ********** *******...(Move a * to the next row and put a space here) *......... *........c |
6.4) 如果 rs >= r - 2, 并且保持 % 2 == 0 然后离开第一个保持/2
前两行的列为空并用地雷填充其他单元格:
1 2 3 4 | c...****** ....****** ********** ********** |
6.5) 如果 rs >= r - 2,并且保持 % 2 == 1,则离开
前两行的第一列(仍为 -3)/2 列为空,
第三行的前三列为空,然后填充
其他有地雷的牢房:
1 2 3 4 | c...****** ....****** ...******* ********** |
现在所有条件都可以覆盖了。
我是这个系统的新手。如果你真的喜欢我的解决方案,希望能得到一些积分。并欢迎发布您的解决方案。非常感谢!
(在这里发帖是因为我没有 10 个代表。另一个)
我的解决方案:
C 代码在这里。