POJ 3279 Fliptile(状态压缩+暴力)
来源:互联网 发布:钢铁侠分析软件 编辑:程序博客网 时间:2024/06/01 11:48
题意:
给出最高15*15的0 1矩阵,每次可以翻转一个点,其相邻的4个点都被翻转,问最少翻转几次可以全部变为0。
解析:
枚举第一行的翻转所有翻转情况然后逐行向下更新,如果上一行是1的话,那么下面一行肯定要翻转,因为只有下面一行能影响上面一行。
最后判断一下,最后一行是不是都是0,如果都是,则维护最小的翻转次数。
AC代码:
#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int N = 17;const int dx[] = {-1, 0, 1, 0, 0};const int dy[] = { 0,-1, 0, 1, 0};int grid[N][N], state[N][N], tmp[N][N], rec[N][N];int n, m, ans;void flip(int x, int y) { tmp[x][y] = 1; int nx, ny; for(int i = 0; i < 5; i++) { nx = x+dx[i]; ny = y+dy[i]; state[nx][ny] = !state[nx][ny]; }}bool isEmpty(int n) { for(int j = 1; j <= m; j++) { if(state[n][j]) return false; } return true;}void solve(int st) { memcpy(state, grid, sizeof(grid)); memset(tmp, 0, sizeof(tmp)); int cnt = 0; for(int j = 0; j < m; j++) { if((st>>j) & 1) { flip(1, j+1); cnt++; } } for(int i = 2; i <= n; i++) { for(int j = 1; j <= m; j++) { if(state[i-1][j] == 1) { flip(i, j); cnt++; } } } if(isEmpty(n) && cnt < ans) { ans = cnt; memcpy(rec, tmp, sizeof(tmp)); }}int main() { while(scanf("%d%d", &n, &m) != EOF) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { scanf("%d", &grid[i][j]); } } ans = INF; int end = 1 << m; for(int st = 0; st < end; st++) solve(st); if(ans == INF) puts("IMPOSSIBLE"); else { for(int i = 1; i <= n; i++) { printf("%d", rec[i][1]); for(int j = 2; j <= m; j++) printf(" %d", rec[i][j]); puts(""); } } } return 0;}
0 0
- POJ 3279 Fliptile(状态压缩+暴力)
- POJ 3279 Fliptile 开关灯问题(状态压缩加暴力搜索)
- POJ 3279 Fliptile(暴力)
- POJ 3279 (状态压缩暴力枚举)
- poj 3279 Fliptile(二进制暴力)
- POJ-3279-Fliptile【状态压缩】【DFS】【好题】
- POJ 3279 Fliptile(枚举状态)
- POJ 3279 Fliptile (暴力枚举)(D)
- POJ 3279 Fliptile(二进制枚举暴力)
- POJ 3279Fliptile(状态枚举+搜索)
- poj 3279 Fliptile—二进制暴力的运用(开关问题)
- POJ 3279 Fliptile(反转)
- poj 3279 Fliptile (状压)
- POJ 3279 Fliptile (反转)
- poj3279 Fliptile dfs暴力枚举状态
- POJ3279 Fliptile —— 状态压缩 + 模拟
- POJ 3279 Fliptile (二进制+搜索)
- POJ - 3279 Fliptile(开关问题)
- Struts2使用拦截器完成权限控制示例
- android学习 - 问题1 - 项目名称:1-hello运行报错
- 机器学习--k均值聚类(k-means)算法
- Can not issue data manipulation statements with executeQuery()解决方案
- Linux gcc初应用
- POJ 3279 Fliptile(状态压缩+暴力)
- BZOJ 1140 POI2009 KOD 编码 DFS
- awk
- 数据挖掘应用案例:RFM模型分析与客户细分(未完成)
- sed
- HDOJ 畅通工程再续 1875
- 第十一周 课后实践:项目二——职员有薪水了(1)
- 关于IOS手势
- U盘小技巧