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的更多相关文章

随机推荐

  1. 远程登录-出现身份验证错误[可能是由于CredSSP加密Oracle修正]

    问题描述 远程桌面登录时,出现身份验证错误,要求的函数不正确,这可能是由于CredSSP加密Oracle修正. 原因,系统更新导致 CVE-2018-0886 的 CredSSP 更新 解决方法1 运 ...

  2. Android(java)学习笔记209:Android线程形态之 HandlerThread

    1.  HandlerThread Android HandlerThread 完全解析 Handler与HandlerThread区别,HandlerThread应用(对比AsyncTask) 备注 ...

  3. FRP-Functional Reactive Programming-函数响应式编程

    响应式编程是一种面向数据流和变化传播的编程范式: 响应式编程和函数式编程的融合: 响应式编程为内核:函数式编程为工具: 流的概念先天适合函数式编程. Some quotes from the arti ...

  4. 新一代的IT实验室长啥样?

    这个时代 “互联网”江湖门派众多 “互联网+”现代农业.“互联网+”制造业. “互联网+”信息技术服务.“互联网+”文化创意服务. “互联网+”社会服务 各种“互联网+” 在不断的改变着我们的生活 这 ...

  5. viewsate用法

    ViewState["名称"]="ssss";直接赋值取值只能在同一个页面使用, 离开页面就会失效

  6. LayIM项目之基础数据获取代码优化,Dapper取代ADO.NET

    前言 最近在开发LayIM融云版,也在进行项目重构,现在在看之前的代码,简直不敢直视.不过不知道以后看现在的代码是不是也是糟糕的一批.LayIM有个接口,一般接触过的开发人员都不会生疏,就是init接 ...

  7. phpstorm下TODO注释

    TODO注释 什么是TODO注释? 标记的注释,表示你代办的任务. 作用 标记你需要编写的任务位置 使用方法 TODO: + 说明: 如果代码中有该标识,说明在标识处有功能代码待编写,待实现的功能在说 ...

  8. 使用IPDB调试Python代码

    (转载自:https://xmfbit.github.io/2017/08/21/debugging-with-ipdb/) IPDB是什么?IPDB(Ipython Debugger),和GDB类似 ...

  9. EF Core 2.1 中的 Eager loading、Explicit loading和LazyLoading (转自MSDN)

    Entity Framework Core allows you to use the navigation properties in your model to load related enti ...

  10. JQuery手写一个简单的轮播图

    做出来的样式: 没有切图,就随便找了一些图片来实现效果,那几个小星星萌不萌. 这个轮播图最主要的部分是animate(),可以先熟悉下这个方法. 代码我放到了github上,链接:https://gi ...