关于大师:Google Code jam 2014 资格赛中 MineSweeperMaster 的其他解决方案?

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 个代表。另一个)

我的解决方案:

  • 如果 M = R * C - 1,则用地雷填充网格;别的:
  • 通过用地雷填充最后一行/列 - 两者中最小的 - 递归地"简化"网格(而你有足够的地雷来做到这一点)。
  • 将其余的地雷按顺序放入最终的"简化"网格中,从右下角开始。这里唯一的限制是你不能在地雷和边界之间留下一个空单元格。
  • 单击 (0,0)。
  • C 代码在这里。