
POJ1753 Flip Game
翻转当前格子,进入下一步递归。 不翻转当前格子,进入下一步递归。 恢复当前格子,返回到上一步的状态。这四行语句确保了每一步的状态可控和回溯的正确性。
发布日期:2021-05-28 16:29:38
浏览次数:39
分类:精选文章
本文共 1900 字,大约阅读时间需要 6 分钟。
以下是优化后的内容:
通用算法实现探索
一、遍历周围格子
这是实现棋盘翻转的一种核心方法。通过定义方向数组 dx
和 dy
,可以快速判断四个方向的相邻格子。利用 judge
函数 ensureasal进行边界检查,保证程序不会越界。
二、状态压缩技术
将棋盘的状态压缩为01的二进制数组,每个格子的值用于表示翻转与否。通过位反运算 ^
实现格子的翻转,简化了状态的操作和判断。
三、深度优先搜索(DFS)实现
DFS 算法用于枚举所有可能的翻转组合。递归函数 void dfs(int cur, int k)
定义了成果的翻转过程。cur
表示当前操作的格子位置,k
表示已翻转格子的数量。
- 递归边界设置为
k == m
(已翻转格子总数),在此时检查是否找到满足条件的解。 - 提前终止递归的标记变量
flag
用于提前退出递归,优化性能。 - 翻转的实现采用函数
flip
,同时翻转当前格子和相关邻接格子(根据魔方阵特性)。
四、翻转回溯
递归中的四行代码是核心逻辑:
完整代码实现
以下是优化后的完整代码片段:
#include#include using namespace std;int chess[4][4];int dx[] = {0, 0, -1, 1};int dy[] = {1, -1, 0, 0};int m = 16;int flag = 0;bool judge(int x, int y) { if (x >= 0 && x < 4 && y >= 0 && y < 4) return true; return false;}void flip(int x, int y) { chess[x][y] ^= 1; for (int i = 0; i < 4; ++i) { int newx = x + dx[i]; int newy = y + dy[i]; if (judge(newx, newy)) { chess[newx][newy] ^= 1; } }}bool end() { int k = chess[0][0]; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { if (chess[i][j] != k) return false; } } return true;}void dfs(int cur, int k) { if (k == m) { if (end()) flag = 1; return; } if (flag || cur == 16) { return; } else { flip(cur / 4, cur % 4); dfs(cur + 1, k + 1); flip(cur / 4, cur % 4); dfs(cur + 1, k); }}void dfstravel() { for (m = 0; m <= 16; ++m) { dfs(0, 0); if (flag) return; }}int main() { // 读取输入并初始化棋盘 char c; for (int i = 0; i < 4; ++i) { for (int j = 0; j < 4; ++j) { cin >> c; if (c == 'b') chess[i][j] = 0; else chess[i][j] = 1; } } dfstravel(); if (flag) { cout << boolalpha; cout << flag << endl; }}
以上代码保留了原有的核心功能,调整了代码的注释与格式,使其更易读,符合开发规范。
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年04月26日 23时30分01秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Jenkins - 部署在Tomcat容器里的Jenkins,提示“反向代理设置有误”
2019-03-06
wxWidgets源码分析(3) - 消息映射表
2019-03-06
wxWidgets源码分析(5) - 窗口管理
2019-03-06
wxWidgets源码分析(8) - MVC架构
2019-03-06
wxWidgets源码分析(9) - wxString
2019-03-06
[梁山好汉说IT] 梁山好汉和抢劫银行
2019-03-06
[源码解析] 消息队列 Kombu 之 基本架构
2019-03-06
[源码分析] 消息队列 Kombu 之 启动过程
2019-03-06
wx.NET CLI wrapper for wxWidgets
2019-03-06
ASP.NET MVC Action Filters
2019-03-06
Powershell中禁止执行脚本解决办法
2019-03-06
OO_Unit2 多线程电梯总结
2019-03-06
04_Mysql配置文件(重要参数)
2019-03-06
JavaSE总结
2019-03-06
手动造轮子——基于.NetCore的RPC框架DotNetCoreRpc
2019-03-06
Python IO编程
2019-03-06
CSS入门总结
2019-03-06