最近在刷kuangbin神犇的各种套题。。。。感觉自己好弱啊。。。。。还是要多多训练,跟上大神的脚步。最近的这十几题都比较水,记下来这一条我比较印象深刻、也比较难的题目吧(之后应该不会再有水题写了,珍惜水题啊QAQ)

思考

题目其实很简单,踩黑白啊,而且规模也不算大。问题在于我们怎么穷举。注意到一个问题,我们对单行中先后变换的次序其实不改变最后的结果。也就是说,对于单列的变换,其实我们可以纯粹的只考虑上下带来的影响。而又注意到每行实际上只影响上下单行,所以我们可以规定一个处理的方向(如从上而下),那么我们每次只需要考虑最新的一行对上面一行带来的影响了。需要注意的是,这种思想我们之后估计会经常用到。(不过本菜狗估计还是做不对emmmmm

这题就是这个思路。穷举第一行的踩踏方式,那么会产生有黑有白。对上一行的黑,只能有此列的下一行来处理,因此我们逐行处理就行了。最后看最后一行合不合法即可。保存最小数据。

代码

#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <set>
using namespace std; int maze[18][18],step[18][18];
int dx[]={0,-1,1,0,0};
int dy[]={0,0,0,-1,1};
int m,n;
int judge(int val)
{
int tmpmaze[18][18];
memcpy(tmpmaze,maze,sizeof(maze));
int cnt=0;
memset(step,0,sizeof(step));
for(int i=1;i<=m;++i)
{
if(i==1) for(int j=1;j<=n;++j)
{
if((val>>(n-j))&1)
{
step[i][j]++;cnt++;
for(int k=0;k!=5;++k)
{
int tx=i+dx[k],ty=j+dy[k];
if(tx>=1 && tx<=m && ty>=1 && ty<=n)
tmpmaze[tx][ty]^=1;
}
}
}
else for(int j=n;j>=1;--j)
{
if(tmpmaze[i-1][j])
{
step[i][j]++;cnt++;
for(int k=0;k!=5;++k)
{
int tx=i+dx[k],ty=j+dy[k];
if(tx>=1 && tx<=m && ty>=1 && ty<=n)
tmpmaze[tx][ty]^=1;
}
}
}
}
for(int i=1;i<=n;++i) if(tmpmaze[m][i]) return -1;
return cnt;
}
int main()
{
while(cin>>m>>n)
{
for(int i=1;i<=m;++i)
for(int j=1;j<=n;++j)
cin>>maze[i][j];
int minans=0x3f3f3f3f,minstep[18][18];
memset(minstep,0,sizeof(minstep));
for(int i=0;i!=(1<<n);++i)
{
int ans=judge(i);
if(ans!=-1 && minans>ans)
{
memcpy(minstep,step,sizeof(step));
minans=ans;
}
}
if(minans==0x3f3f3f3f)
cout<<"IMPOSSIBLE"<<endl;
else for(int i=1;i<=m;++i)
{
for(int j=1;j<=n;++j)
cout<<minstep[i][j]<<" ";
cout<<endl;
}
}
return 0;
}

【个人训练】(POJ3279)Fliptile的更多相关文章

  1. POJ3279 Fliptile —— 状态压缩 + 模拟

    题目链接:http://poj.org/problem?id=3279 Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submiss ...

  2. POJ3279 Fliptile(暴力)

    有一种暴力是这样的,枚举一边,确定另一边. 这一题是这么解的,枚举第一行所有翻转情况,然后剩下几行其实是确定的,因为前i行翻转方式确定后只能通过第i+1行的翻转来改变第i行的状态,于是依次模拟求出剩下 ...

  3. [POJ3279]Fliptile(开关问题,枚举)

    题目链接:http://poj.org/problem?id=3279 题解:http://www.cnblogs.com/helenawang/p/5538547.html /* ━━━━━┒ギリギ ...

  4. POJ3279 Fliptile 枚举+简单搜索

    题意:一个矩阵,每个点1或0,然后每次翻一个点,它周围上下左右(包括自己)1->0,0->1,问最少翻几次可以矩阵全是0,忽略题目说的字典序 分析:枚举第一行所有的情况,然后下面几行也随之 ...

  5. POJ-3279.Fliptile(二进制状态压缩 + dfs) 子集生成

    昨天晚上12点刷到的这个题,一开始一位是BFS,但是一直没有思路.后来推了一下发现只需要依次枚举第一行的所有翻转状态然后再对每个情况的其它田地翻转进行暴力dfs就可以,但是由于二进制压缩学的不是很透, ...

  6. poj3279 Fliptile

    思路: 枚举. 枚举了第一行的操作之后,下面每行的操作也随之确定了.因为在确定了第i行的操作之后,要想再改变a[i][j]的状态只能通过改变a[i + 1][j]来实现.另外,用到了集合的整数表示方法 ...

  7. Fliptile POJ-3279 DFS

    题目链接:Fliptile 题目大意 有一个01矩阵,每一次翻转(0->1或者1->0)一个元素,就会把与他相邻的四个元素也一起翻转.求翻转哪些元素能用最少的步骤,把矩阵变成0矩阵. 思路 ...

  8. Fliptile [POJ3279] [开关问题]

    题意 给定一张n*m的方格图,有1,0两种数字,每次可以选取一个十字进行翻转,1变成0,0变成1,问最少需要翻转几次,使它全部变成0,全部如果有重复的,按字典序最小的进行输出: 输入 第一行n,m 下 ...

  9. (POJ-3279)Fliptile (dfs经典---也可以枚举)

    Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...

随机推荐

  1. 安卓extends和implements

    extends是继承类 implements是实现接口

  2. 使用cmd命令进行运行java(cmd命令输出Hello word)

    使用cmd命令输出Hello word 条件,按照好jdk和jre的环境下,如果没有安装,请安装,简单安装教程链接:https://www.cnblogs.com/weibanggang/p/9392 ...

  3. hbase 数据拷贝

    由于运营数据太大,另外避免影响正常访问,所以需要临时拷贝部分数据到临时表中. bin/hbase org.apache.hadoop.hbase.mapreduce.CopyTable [--star ...

  4. ADO.NET 之 Entity Framework 基础

    Entity Framework(EF)是使用直接映射到应用程序中业务对象的对象模型于关系数据库进行交互.它没有将数据视为行和列的集合,而是将其视为强类型对象(成为实体)的集合. 术语:LinQ to ...

  5. 将某页面中ajax中获取到的信息放置到sessionStorage中保存,并在其他页面调用这些数据。

    A页面代码: var obj = data.data; var infostr = JSON.stringify(obj);//转换json sessionStorage.obj = infostr; ...

  6. [HP-UNIX]bdf命令总结

    (1)bdf命令的效果 lijiaman$[/home/oracle]bdf Filesystem kbytes used avail %used Mounted on /dev/vg00/lvol3 ...

  7. foreach, for in, for of 之间的异同

    forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数. 注意: forEach() 对于空数组是不会执行回调函数的. 示例代码: var arr = [4, 9, 16, 25]; ...

  8. ES6 async await

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 【剑指offer】 Java实现重建二叉树

    GitHub上的代码链接 /** * @Author: DaleyZou * @Description: 重建二叉树 * 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树. * 假设输入的前序 ...

  10. Qt基于model/view数据库编程3

    QSqlQueryModel和QSqlQuery类: 工程开发过程中将这两个类合起来使用,用QSqlQueryModel查询展示数据库中的数据,用QSqlQuery类执行sql语言,实现对数据库的操作 ...