Fliptil_KEY
Fliptil(fliptile.pas/c/cpp)
【问题描述】
约翰知道,那些高智力又快乐的奶牛产奶量特别高。所以他做了一个翻瓦片的益智游戏来娱乐奶牛。
在一个M×N的骨架上,每一个格子里都有一个可以翻转的瓦片。瓦片的一面是黑色的,而另一面是白色的。对一个瓦片进行翻转,可以使黑变白,也可以使白变黑。然而,奶牛们的蹄子是如此的巨大而且笨拙,所以她们翻转一个瓦片的时候,与之有公共边的相邻瓦片也都被翻转了。
那么,这些奶牛们最少需要多少次翻转,使所有的瓦片都变成白面向上呢?如果可以做到,输出字典序最小的结果(将结果当成字符串处理),如果不能做到输出"IMPOSSIBLE".
【输入格式】
第1行输入M和N;之后M行N列,输入游戏开始时的瓦片状态,0表示白面向上,1表示黑面向上。
【输出格式】
输出M行,每行N个用空格隔开的整数,表示对应的格子是否进行了翻动,0表示不翻动,1表示翻动。
【输入样例】
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
【输出样例】
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0
【数据规模】
对于50%的数据:1≤M,N≤5;
对于70%的数据:1≤M,N≤10;
对于100%的数据:1≤M,N≤15;
看数据范围应该也猜得到是状态压缩+DFS。
一开始直接枚举第一行的状态,即翻或不翻的状态(状压)。
因为如果上一行是1,那么这一格一定要翻。
N^2做一遍即可。
理论复杂度O((2^M)*(N^2))
code:
#include <cstdio>
using namespace std;
char tc(){
static char fl[],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,,,stdin),A==B)?EOF:*A++;
}
int read(){
char c;while(c=tc(),c<''||c>'');int x=c-'';
while(c=tc(),c>=''&&c<='')x=(x<<)+(x<<)+c-'';
return x;
}
int N,M,a[][],t[][],ans[][],w[][],res=2e9;
void rotate(int x,int y){
t[x][y]^=;w[x][y]=;
if(x->=)t[x-][y]^=;if(y->=)t[x][y-]^=;
if(x+<=N)t[x+][y]^=;if(y+<=M)t[x][y+]^=;
}
void check(int wks){
int tk=;
for(int i=;i<=N;i++)for(int j=;j<=M;j++)w[i][j]=,t[i][j]=a[i][j];
for(int i=;i<=M;i++)
if(<<i-&wks){
tk++;if(tk>=res)return ;//如果大于最优解直接return ;
rotate(,M-i+);
}//旋转第一行的(按wks状态旋转)
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)
if(t[i-][j]){
tk++;if(tk>=res)return ;
rotate(i,j);
}
for(int j=;j<=M;j++)if(t[N][j])return ;
res=tk;
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)ans[i][j]=w[i][j];
}
void puts(){
for(int i=;i<=N;i++){
for(int j=;j<=M;j++)
printf("%d ",ans[i][j]);
puts("");
}
}
int main(){
freopen("fliptile.in","r",stdin);
freopen("fliptile.out","w",stdout);
N=read(),M=read();
for(int i=;i<=N;i++)
for(int j=;j<=M;j++)a[i][j]=read();
for(int i=;i<(<<M);i++)
check(i);
if(res==2e9)puts("IMPOSSIBLE");
else puts();
}
Fliptil_KEY的更多相关文章
随机推荐
- 使用websploit在局域网全自动渗透
原理为 websploit调用dnsdpoof进行dns欺骗配合神器metasploit的web_autopwn模块进行渗透:特点:过程基本全自动. 终端输入websploit打开websploit: ...
- hibernate 映射 数据库number 映射为 double 为空 报错问题
将 数据库表 映射成hibernate 实体类时 将number --- double 如果数据库中number 为空,查找数据时将报错 Can not set double field ***** ...
- UVa 1658 - Admiral(最小费用最大流 + 拆点)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- SMB linux&windows共享文件
搭建就不多说了:https://www.xuebuyuan.com/3235974.html 在其中可以用cd(进入目录),ls(罗列文件和文件夹),get(下载文件),put(上载文件) 等命令进行 ...
- rc.local 开机自启脚本无法启动
1.看是否rc.local 第一行如果是 #!/bin/sh -e 改成 #!/bin/bash sudo systemctl enable rc-local.service 2.看rc.local的 ...
- PHP 判断常量,变量和函数是否存在
判断变量是否被定义:defined() if (defined('CONST_NAME')) { //do something } 判断变量是否存在:isset() ,注意变量未声明或声明时赋值为NU ...
- 全新释放 | RealSight APM, 让客户的极致数字体验成为可能
根据专业评测机构 downdetector.com 统计,2018年,Facebook 系统全年宕机 200 次,Youtube 宕机 140 次,Google 宕机 100 次.每次宕机损失至少 ...
- web.xml中Listener的作用
Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应 ...
- vue中调用地图
一. vue-amap,一个基于 Vue 2.x 和高德地图的地图组件 这个就不细说了,按照其文档,就能够安装下来. 二. 按照官方提供的方法引入 1.修改webpac.base.conf.js文件 ...
- Ajax同时上传表单序列化参数+自定义参数
$.ajax({ type:'POST', url :"<{:U('jiuzhu/edit')}>", data:$.param({'name1':value1,'na ...