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的更多相关文章
随机推荐
- SDR窃听-监听空中的无线电
A GSM HACK的另一种方法:RTL-SDR 0x00 背景 文中所有内容仅供学习研究,请勿用于非法用途.在绝大多数国家里非法窃听都是严重非法行为. 本文内容只讨论GSM数据的截获,不讨论破解. ...
- AngularJs学习笔记--E2E Testing
原版地址:http://docs.angularjs.org/guide/dev_guide.e2e-testing 当一个应用的复杂度.大小在增加时,使得依靠人工去测试新特性的可靠性.抓Bug和回归 ...
- Vue-Resource请求PHP数据失败的原因
在写一个Vue项目的时候发现在使用Vue-Resource的post方法请求PHP数据时,完全没有反应,查阅资料才知道没有加配置参数: { emulateJSON:true } 这个配置参数的意思是: ...
- xwork-2.1.2.jar与xwork-core-2.1.6.jar的区别是什么? 在线等待 先谢谢了
两个包是一样,都是struts2的核心包.不过有时下在的struts2的jar包中只有xwordk-core-2.1.6.jar包.做项目的时候最好两个都导入.
- html5与html的区别
最近看群里聊天聊得最火热的莫过于手机网站和html5这两个词.可能有人会问,这两者有什么关系呢?随着这移动互联网快速发展的时代,尤其是4G时代已经来临的时刻,加上微软对“XP系统”不提供更新补丁.维护 ...
- Myeclipse 自带Tomcat启动8080端口占用
在启动Myeclipse自带的Tomcat发现报错,显示8080端口被占用 第一步:window+r 组合键,调出命令窗口. 第二步:输出命令:netstat -ano|findstr 8080 ...
- faster-rcnn anchor_target_layer、rpn_proposal_layer、proposal_target_layer
faster rcnn中这三层是单独生成的层,也是复现最复杂的层 anchor_target_layer作用:从众多的anchor中选取出正负样本供rpn网络学习(实际上就是把anchor和gt进行配 ...
- 记录一次Git问题及其解决方案
错误信息:fatal: refusing to merge unrelated histories 错误产生背景:我将原先测试的项目本地删除后提交,然后将新的项目按照git的提交步骤进行提交,在最后一 ...
- 手绘web原型设计的感受
当下有许多流行的Web原型设计工具,比如mockplus等,mockplus在我们团队初次开发rms系统用到过,确实还不错,但是,原型工具有其优势也有其劣势. 礼拜一开会时,经理跟我说,觉得现在的LM ...
- 最简单的Servlet继承HttpServlet查询数据库登录验证
<%-- Created by IntelliJ IDEA. User: yunqing Date: 2017-12-06 Time: 9:11 To change this template ...