[USACO2007OPENS] Fliptile S
题目描述
FJ 知道,智商高的奶牛产奶量也大,所以他为奶牛们准备了一个翻动瓦片的益智游戏。
在一个 \(M \times N\) 的方阵上(\(1 \leq M,N \leq 15\)),每个格子都有一个可以翻转的瓦片。瓦片的一面是黑色,另一面是白色。对一个瓦片翻转,可以让它的颜色由黑到白,或是由白到黑。
然而奶牛们很笨拙,它们翻转一个格子的瓦片时,与其有公共边的所有瓦片也会翻转。
现在奶牛们想知道,至少需要多少次翻转,使所有的瓦片都变成白色朝上呢?
输入格式
第一行两个整数 \(M,N\)。
接下来 \(M\) 行,每行 \(N\) 个整数,表示初始状态,\(0\) 表示白面朝上,\(1\) 表示黑面朝上。
输出格式
如果不能将所有瓦片都翻转为白面朝上的话,输出 IMPOSSIBLE。
否则输出 \(M\) 行,每行 \(N\) 个整数,第 \(i\) 行的第 \(j\) 个数代表第 \(i\) 行第 \(j\) 列的瓦片被翻转了多少次。
你的输出应该确保翻转次数最少。如果存在多种方案,输出字典序最小的方案。
这里的字典序最小指将输出中的所有空白字符去掉后,形成的字符串字典序最小。
样例 #1
样例输入 #1
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
样例输出 #1
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0
提示
下面的方案操作次数同样是最小的,但是字典序不是最小的。
0 1 1 0
0 0 0 0
0 0 0 0
0 1 1 0
首先可以枚举第一行的翻转方案。可以将第一行的翻转方案压成二进制。
考虑第二行,如果在第一行的某个位置是黑色朝上,那么对应的第二行位置也一定要翻转。同理,第二行某个位置黑色朝上,需要第三行去翻转。那么这样子转下去,最后可以判断一下最后一行是不是全部黑色向上。
因为第一行按照二进制枚举,所以我们一但发现这个方案翻转次数等于之前的某一个,那么肯定是之前的那个字典序更小。
#include<bits/stdc++.h>
int a[20][20],b[20][20],cnt,flag,flag1,n,ans=2147483647,f[20][20],g[20][20],m;
char c;
void turn(int x,int y)
{
b[x][y]^=1;
b[x-1][y]^=1;
b[x+1][y]^=1;
b[x][y+1]^=1;
b[x][y-1]^=1;
}
void calc(int i,int t)
{
cnt=0;
memcpy(b,a,sizeof(b));
memset(g,0,sizeof(g));
for(int j=1;j<=m;++j)
{
if(i&1<<(j-1))
{
turn(1,j);
g[1][j]=1,++cnt;
}
}
for(int j=2;j<=n;j++)
{
for(int k=1;k<=m;k++)
{
if(b[j-1][k]!=t){
turn(j,k);
cnt++,g[j][k]=1;
}
}
}
if(cnt<ans)
{
flag1=1;
for(int j=1;j<=m;j++)
if(b[n][j]!=t)
flag1=0,j=m;
if(flag1)
{
ans=cnt;
memcpy(f,g,sizeof(g));
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
scanf("%d",a[i]+j);
}
}
for(int i=0;i<(1<<m);++i)
calc(i,0);
if(ans==2147483647)
{
printf("IMPOSSIBLE");
return 0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
printf("%d ",f[i][j]);
printf("\n");
}
return 0;
}
[USACO2007OPENS] Fliptile S的更多相关文章
- Enum:Fliptile(POJ 3279)
Fliptile 题目大意:农夫想要测牛的智商,于是他把牛带到一个黑白格子的地,专门来踩格子看他们能不能把格子踩称全白 这一题其实就是一个枚举题,只是我们只用枚举第一行就可以了,因为这一题有点像开关一 ...
- 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile
[源码下载] 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile 作者:webabcd 介绍与众不同 windows ...
- Fliptile 开关问题 poj 3279
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4031 Accepted: 1539 Descript ...
- Fliptile
开关题 尺度法 Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3394 Accepted: ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- 1647: [Usaco2007 Open]Fliptile 翻格子游戏
1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 423 Solved: 173[ ...
- [Usaco2007 Open]Fliptile 翻格子游戏
[Usaco2007 Open]Fliptile 翻格子游戏 题目 Farmer John knows that an intellectually satisfied cow is a happy ...
- Fliptile 翻格子游戏[Usaco2007 Open]
题目描述 Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状态压缩
考试想到了状压,苦于T1废掉太长时间,于是默默输出impossible.. 我们知道,一个格子的翻转受其翻转次数和它相邻翻转次数的影响. 由每一个位置操作两次相当于把它翻过来又翻回去,所以答案中每一个 ...
- Fliptile 翻格子游戏
问题 B: [Usaco2007 Open]Fliptile 翻格子游戏 时间限制: 5 Sec 内存限制: 128 MB 题目描述 Farmer John knows that an intell ...
随机推荐
- 无界AI绘画基础教程,和Midjourney以及Stable Diffusion哪个更好用?
本教程收集于:AIGC从入门到精通教程汇总 简单的总结 Midjourney,Stable Diffusion,无界AI的区别? Midjourney,收费,上手容易,做出来高精度的图需要自己掌握好咒 ...
- Kafka-基础
1. 简介 Kafka(Apache Kafka) 是一种分布式流数据平台,最初由LinkedIn开发,并于后来捐赠给Apache软件基金会,成为了一个Apache顶级项目.它被设计用于处理大规模.实 ...
- 让你的HpSocket Pull支持同步(应答式)操作
什么是HPSocket HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/ ...
- KRPano多屏互动原理
KRPano可以实现多个屏幕之间的同步显示,主要应用到Websocket技术进行通信. 在控制端,我们需要发送当前KRPano场景的实时的视角和场景信息,可以使用如下的代码: embedpano({ ...
- C++模板介绍
C++ 模板 C++ 模板是一种强大的泛型编程工具,它允许我们编写通用的代码,可以用于处理多种不同的数据类型.模板允许我们在编写代码时将类型作为参数进行参数化,从而实现代码的重用性和灵活性. 在 C+ ...
- 小知识:将普通用户加入到docker组
新的OCI实例,OS选择的是OEL7.9,初始环境是没有安装docker的,我们可以直接使用yum安装,之后启动docker服务: [opc@oci-001 ~]$ sudo yum install ...
- 「codeforces - 687D」Dividing Kingdom II
link. 好题啊. 首先有一个类 kruskal 暴力,就是对于每一个询问,把所有边按权值大小排降序,第一个加进去成为奇环的边就是答案.注意我们不需要关注偶环长成什么样子,所以我们实际上维护的是一棵 ...
- Solution -「YunoOI 2016」镜中的昆虫
Description Link. 区间推平: 区间数颜色. Solution 考虑无修的情况,我们是采用维护每个数的 \(pre\) 来做的.具体一点就是对于每一个 \(a_{i}\) 维护 \(p ...
- 其它——Siege压力测试工具使用
文章目录 Siege压力测试工具使用 一 Siege介绍 二 windows 下使用 三 mac和linux使用 四 使用 五 参数详解 六 结果详解 七 修改系统的文件描述符限制 Siege压力测试 ...
- Vue2系列(lqz)——slot插槽 (内容分发)、2 transition过渡、3 生命周期、4 swiper学习、5 自定义组件的封装、6 自定义指令、7 过滤器
文章目录 1 slot插槽 (内容分发) 1.1 基本使用 1.2 插槽应用场景1 1.3 插槽应用场景2 1.4 具名插槽 2 transition过渡 3 生命周期 4 swiper学习 5 自定 ...