Enum:EXTENDED LIGHTS OUT(POJ 1222)
2016-01-24 19:44
441 查看
![](http://images2015.cnblogs.com/blog/798615/201601/798615-20160124193931265-579251647.jpg)
亮灯
题目大意:有一个5*6的灯组,按一盏灯会让其他上下左右4栈和他自己灯变为原来相反的状态,要怎么按才会把所有的灯都按灭?
3279翻版题目,不多说,另外这一题还可以用其他方法,比如DFS,BFS,不过这些都挺慢的,月还有一个特别厉害的方法,高斯消元法,等我以后再来写
#include <iostream> #include <algorithm> #include <functional> using namespace std; static int map[5][6], store[5][6], flip[5][6]; static int dirx[4] = { -1, 0, 0, 1 }; static int diry[4] = { 0, -1, 0, 0 }; int solve(void); int get_light(const int, const int); int main(void) { int sum_of_martrix, ans, res; scanf("%d", &sum_of_martrix); for (int k = 1; k <= sum_of_martrix;k++) { ans = INT_MAX; for (int i = 0; i < 5; i++)//Read Gragh for (int j = 0; j < 6; j++) scanf("%d", &map[i][j]); for (int i = 0; i < 1 << 6; i++) { memset(flip, 0, sizeof(flip)); for (int j = 0; j < 6; j++) flip[0][5 - j] = (i >> j) & 1; res = solve(); if (res < ans) { ans = res; memcpy(store, flip, sizeof(flip)); } } printf("PUZZLE #%d\n", k); for (int i = 0; i < 5; i++) { for (int j = 0; j < 6; j++) printf("%d ", store[i][j]); printf("\n"); } } return EXIT_SUCCESS; } int solve(void) { int ans = 0; for (int i = 1; i < 5; i++) for (int j = 0; j < 6; j++) flip[i][j] = get_light(i - 1, j);//如果这一列的上一行是亮灯,那么必须按下这盏灯 for (int j = 0; j < 6; j++) { if (get_light(4, j) == 1)//看最后一行的灯的情况是否全部灯都灭了 return INT_MAX; } for (int i = 0; i < 5; i++) for (int j = 0; j < 6; j++) ans += flip[i][j]; return ans; } int get_light(const int y, const int x) { int dx, dy, sum = map[y][x]; for (int i = 0; i < 4; i++) { dx = x + dirx[i]; dy = y + diry[i]; if (0 <= dx && dx < 6 && 0 <= dy && dy < 5) sum += flip[dy][dx]; } return sum % 2; }
![](http://images2015.cnblogs.com/blog/798615/201601/798615-20160124194310343-988759480.jpg)
相关文章推荐
- android:visibility的三种属性
- 单例模式
- express + redis 构建基于node的开发环境
- 网页内容的html标签补全和过滤的两种方法
- opencv学习笔记(二十三)——相机标定原理详解
- JavaBean与jsp的动作
- HDU——2091空心三角形
- Vigenère密码题解
- Python爬虫入门(7):正则表达式
- 【POJ 2400】 Supervisor, Supervisee(KM求最小权匹配)
- <LeetCode OJ> 238. Product of Array Except Self
- 【时间管理】调整我的时间轴
- 数据结构基础(四)树和二叉树
- 使用gcc和cmake编译工具编辑opencv例子
- 兔子出生总数问题
- IIemaGpmuJ.45
- thinkphp许愿墙后台
- Baby Ming and Weight lifting
- 创建动态的表格
- 爱因斯坦 上楼梯问题 若每步跨2阶,剩1阶 两种方法