以下是我的解决方案,但它只能解决问题。我希望我能看到一些好的解决方案,它们使用一些动态编程或其他算法(除了蛮力)来尝试将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...****** ....****** ...******* **********
现在可以涵盖所有条件。
我是这个系统的新手。如果你真的喜欢我的解决方案,希望得到一些学分。欢迎发布您的解决方案。非常感谢你!
答案 0 :(得分:1)
(在这里发帖,因为我不会为另一个人提供10个代表)
我的解决方案:
C代码为here。