POJ 3279
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 3062 | Accepted: 1178 |
Description
Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which they manipulate an M × N grid (1 ≤ M ≤ 15; 1 ≤ N ≤ 15) of square tiles, each of which is colored black on one side and white on the other side.
As one would guess, when a single white tile is flipped, it changes to black; when a single black tile is flipped, it changes to white. The cows are rewarded when they flip the tiles so that each tile has the white side face up. However, the cows have rather large hooves and when they try to flip a certain tile, they also flip all the adjacent tiles (tiles that share a full edge with the flipped tile). Since the flips are tiring, the cows want to minimize the number of flips they have to make.
Help the cows determine the minimum number of flips required, and the locations to flip to achieve that minimum. If there are multiple ways to achieve the task with the minimum amount of flips, return the one with the least lexicographical ordering in the output when considered as a string. If the task is impossible, print one line with the word "IMPOSSIBLE".
Input
Lines 2..M+1: Line i+1 describes the colors (left to right) of row i of the grid with N space-separated integers which are 1 for black and 0 for white
Output
Sample Input
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
Sample Output
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; const int MAX = ;
const int dx[] = {-,,,,};
const int dy[] = {,-,,,};
int N,M;
int tile[MAX][MAX];
int flip[MAX][MAX];
int opt[MAX][MAX]; int get(int x,int y) {
int c = tile[x][y];
for(int d = ; d < ; ++d) {
int x1 = x + dx[d],y1 = y + dy[d];
if(x1 >= && x1 <= N && y1 >= && y1 < M) {
c += flip[x1][y1];
}
}
return c % ; }
int cal() {
int res = ;
int t[MAX * MAX + ];
for(int i = ; i <= N; ++i) {
for(int j = ; j < M; ++j) {
if(get(i - ,j)) {
flip[i][j] = ;
}
}
} for(int i = ; i < M; ++i) {
if(get(N,i)) return -;
} for(int i = ; i <= N; ++i) {
for(int j = ; j < M; ++j) {
res += flip[i][j];
}
} return res; } void solve() {
int res = -;
for(int s = ; s < ( << M); ++s) {
memset(flip,,sizeof(flip));
for(int i = ; i < M; ++i) {
if(s & ( << i)) flip[][i] = ;
}
int num = cal();
//printf("num = %d\n",num);
if(num >= && (res < || res > num)) {
res = num;
memcpy(opt,flip,sizeof(flip));
} } if(res < ) {
printf("IMPOSSIBLE\n");
} else {
for(int i = ; i <= N; ++i) {
for(int j = ; j < M; ++j) {
printf("%d",opt[i][j]);
if(j != M - ) printf(" "); }
printf("\n");
}
}
} int main()
{
// freopen("sw.in","r",stdin);
scanf("%d%d",&N,&M);
for(int i = ; i <= N; ++i) {
for(int j = ; j < M; ++j) {
scanf("%d",&tile[i][j]);
//printf("%d ",tile[i][j]);
}
//printf("\n");
} solve();
//cout << "Hello world!" << endl;
return ;
}
POJ 3279的更多相关文章
- 【枚举】POJ 3279
直达–>POJ 3279 Fliptile 题意:poj的奶牛又开始作孽了,这回他一跺脚就会让上下左右的砖块翻转(1->0 || 0->1),问你最少踩哪些砖块才能让初始的砖块全部变 ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- 状态压缩+枚举 POJ 3279 Fliptile
题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...
- 【POJ 3279 Fliptile】开关问题,模拟
题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...
- POJ 3279 Fliptile[二进制状压DP]
题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...
- POJ 3279 - Fliptile - [状压+暴力枚举]
题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...
- POJ - 3279 Fliptile (枚举)
http://poj.org/problem?id=3279 题意 一个m*n的01矩阵,每次翻转(x,y),那么它上下左右以及本身就会0变1,1变0,问把矩阵变成全0的,最小需要点击多少步,并输出最 ...
- poj 3279 Fliptile(二进制)
http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...
随机推荐
- 多线程异步加载图片async_pictures
异步加载图片 目标:在表格中异步加载网络图片 目的: 模拟 SDWebImage 基本功能实现 理解 SDWebImage 的底层实现机制 SDWebImage 是非常著名的网络图片处理框架,目前国内 ...
- SQL Server基础
一.常用命令 1.使用命令行开启SQL Server服务 获取管理员权限的命令行工具: net start mssqlserver 开启sql server服务 net restart mssqlse ...
- ANT编译build.xml
一,体验ant就像每个语言都有HelloWorld一样,一个最简单的应用能让人感受一下Ant1,首先你要知道你要干什么,我现在想做的事情是:编写一些程序编译它们把它打包成jar包把他们放在应该放置的地 ...
- Concurrency Series 1
Difference between Processes and Threads Processes A process has a self-contained execution environm ...
- URI与URL的区别
(原网址:http://zhidao.baidu.com/question/38764759.html) Web上可用的每种资源 - HTML文档.图像.视频片段.程序等 - 由一个通过通用资源标志符 ...
- Jquery Mobile局部刷新后js和css失效,需局部渲染
$(function () { $("#submit").click(function(){ var storage = window.localStorage; ...
- My mac cannot run 类相关的操作 , which is lower than 类相关的操作。
首先你选择的项目是mac项目, 其次,你MAC的系统版本小于你当前项目部署环境的最低支持版本 要么升级你的MAC系统,要么再project—>target设置developerme ...
- cocos游戏的真正入口,用C++实现的demo版本
1.cocos游戏的出发点 在main函数中有一句: return CCApplication::sharedApplication()->run(); 2.经过层层深入发现,真正的入口: ...
- C++中的set和java的hashset有何区别?
以前对C++的STL容器烂熟于心,两年没碰过C++了,现在已经很生疏了.工作原因转战java,对java的容器不甚了解,特别是每看到一种容器,不由自主地拿起和C++对比.C++中的set和java的h ...
- Android 锁屏软件MemoryDebris测试报告
目 录 项目基本信息 第1章 引言 1.1 编写目的 1.2 项目背景 1.3 参考资料 1.4 术语和缩略语 第2章 ...