Advertisement

POJ 1753 用DFS解决翻棋子问题

阅读量:

终于填上了最后一个坑。依然是关于递归的问题,在过去的一段时间内我做了大量的相关练习题。而下一个挑战则是汉诺塔问题。

对于这个问题,在参考诸多博客后仍能自行解答出来。不过为了深入理解其中的逻辑关系还是决定尝试着用自己的话进行梳理与总结。

具体来说就是这样一个游戏:在一个4×4方格中允许用户根据需要任意填充黑白色方块直至覆盖整个游戏区域。游戏的操作规则是每次选择一个方块进行翻转同时其上下左右四个相邻方块也会随之改变状态(如果选中的边缘或角落方块则仅对其存在邻居的方向进行操作)。我们的目标则是找出在最少操作次数下实现所有方块颜色一致所需的理论最小值,并通过编程或数学方法加以验证。

题目提供了一个示例,请看下面的棋盘布局:
分别如下:
bwwb
bbwb
bwwb
bwww
那么就需要计算并输出该棋盘的最少翻转次数:4

一共定义了5个核心功能模块:1.用户输入棋子建立棋盘的模块:build_chessboard;2.判断棋盘是否已达到颜色统一状态的机制:finish;3.负责实现翻转棋子的动作:turn;4.评估边界情况以辅助翻转决策的程序:flip;5.深度优先搜索算法框架:dps(深度优先搜索)

前4个函数都不难理解,实现起来也容易,头疼的是dfs。

复制代码
    void dfs (int now_place,int num_turn)//now

全部评论 (0)

还没有任何评论哟~