Google代码中的MineSweeperMaster的任何其他解决方案都会阻止2014年的资格认证?

时间:2014-04-14 11:08:03

标签: master minesweeper

以下是我的解决方案,但它只能解决问题。我希望我能看到一些好的解决方案,它们使用一些动态编程或其他算法(除了蛮力)来尝试将0个单元放入电路板。

以下是我算法的步骤:

 set remains = r * c - m.

1)m = 0:都是自由空间。打印“。”然后在所有细胞中 用“c”覆盖任何单元格。

2)仍然= 1:同样的想法,。在所有单元格中打印“*”然后覆盖 任何带有“c”的单元格。

3)如果r == 1,或c == 1:解决方案在前m个单元格中放置“*”,在“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”,  其他细胞是“。”

**********
**********
**********
**********
****......
..........
..........

6.2)如果rs< r -3和cs == c -1,然后将一个矿井移动到下一行的开头。 (本例)

**********
**********
**********
*********.(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,那么将两个地雷移动到两行的开头

**********
**********
**********
*********.(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 前两行的列为空,并用地雷填充其他单元格:

c...******
....******
**********
**********

6.5)如果rs> = r - 2,并且仍然是%2 == 1,则离开 前两行的第一个(保持-3)/ 2列为空,  并且第3行的前三列为空,并填充 其他有地雷的细胞:

c...******
....******
...*******
**********

现在可以涵盖所有条件。

我是这个系统的新手。如果你真的喜欢我的解决方案,希望得到一些学分。欢迎发布您的解决方案。非常感谢你!

1 个答案:

答案 0 :(得分:1)

(在这里发帖,因为我不会为另一个人提供10个代表)

我的解决方案:

  1. 如果M = R * C - 1,用地雷填充网格;否则:
  2. 递归地"简化"通过填充最后一行/列 - 两者中最小的一个 - 与地雷(虽然你有足够的地雷可以做到这一点)。
  3. 将其余的地雷放入最后的"简化"网格,从右下角开始依次排列。这里唯一的限制是你不能在矿区和边界之间留下一个空单元格。
  4. 点击(0,0)。
  5. C代码为here