POJ 3279 Fliptile
2015-09-21 22:52
393 查看
Fliptile
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
Line 1: Two space-separated integers: M and N
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
Lines 1..M: Each line contains N space-separated integers, each specifying how many times to flip that particular location.
Sample Input
Sample Output
题目大意,:在N*M的格子里面有一些格子是黑色的,奶牛想把他全部变成白色,每次翻动一块的时候他上下左右都会一起翻面,确定再翻面最小的情况下按字典序最小输出翻的格子
思路:枚举每次枚举第一行翻面的情况,之后前一行如果出现黑色第二行就必须翻最后当最后一行全部是白色的时候就可以确定已经全部翻面为白色。
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 5386 | Accepted: 2047 |
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
Line 1: Two space-separated integers: M and N
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
Lines 1..M: Each line contains N space-separated integers, each specifying how many times to flip that particular location.
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
题目大意,:在N*M的格子里面有一些格子是黑色的,奶牛想把他全部变成白色,每次翻动一块的时候他上下左右都会一起翻面,确定再翻面最小的情况下按字典序最小输出翻的格子
思路:枚举每次枚举第一行翻面的情况,之后前一行如果出现黑色第二行就必须翻最后当最后一行全部是白色的时候就可以确定已经全部翻面为白色。
#include<iostream> #include<cstdio> #include<cstring> using namespace std; #define inf 0x3f3f3f3f #define maxn 17 #define maxm 10000 int n,m,x,vis; bool Map[maxn][maxn],dis[maxn][maxn],ans[maxn][maxn]; int disx[5][2] = {0,0,-1,0,0,-1,1,0,0,1}; void fun() { bool M[maxn][maxn]; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) M[i][j] = Map[i][j]; int v = 0; for(int j = 1; j <= m; j++) { if(dis[1][j]){ v++; for(int k = 0; k < 5; k++) M[1+disx[k][0]][j+disx[k][1]] = !M[1+disx[k][0]][j+disx[k][1]]; } } for(int i = 2; i <= n; i++) for(int j = 1; j <= m; j++) { if(M[i-1][j]) { v++; dis[i][j] = true; for(int k = 0; k < 5; k++) M[i+disx[k][0]][j+disx[k][1]] = !M[i+disx[k][0]][j+disx[k][1]]; } } bool flag = true; for(int i = 1; i <= m; i++) if(M [i]) { flag = false; break; } if(flag && v < vis) { vis = v; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++ ) ans[i][j] = dis[i][j]; } } int main() { vis = inf; scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { scanf("%d",&x); if(x) Map[i][j] = true; else Map[i][j] = false; } for(int i = 0; i <= (1<<m)-1 ; i++)//其实这里是可以打表节约时间的因为懒 { int k = 0; memset(dis,0,sizeof(dis)); for(int j = 0; j < m; j++) { if(i&(1<<j)) dis[1][j+1] = true; } fun(); } if(vis == inf) printf("IMPOSSIBLE\n"); else { for(int i = 1; i <= n; i++) { cout<<ans[i][1]; for(int j = 2; j <= m; j++ ) cout<<' '<<ans[i][j]; cout<<endl; } } return 0; }
相关文章推荐
- slf4j-api、slf4j-log4j12以及log4j之间什么关系?
- 【译】Java语言速览:StackOverflow
- 数据库基本查询方法等
- Makefile 调试
- memcached基本配置与使用
- 目中无人是不行的
- 修行路上,有你,有我,有大家。
- solaris 常用软件安装
- 第七节 文件系统操作与磁盘管理
- 代写2
- 开机动画,水滴波纹
- 数据结构_线性结构_线性表
- Android 4.4.2 ICU 语言包 精简、裁剪、定制、本地化
- Android 传感器
- 进程间通信(java)--队列
- 关于内存以及基本单位
- TortoiseGit 的使用
- 单片机IO口模拟SPI四种模式的程序
- http协议
- php循环结构