最近在刷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. Python实现读取json文件到excel表

    一.需求 1.'score.json' 文件内容: { "1":["小花",99,100,98.5], "2":["小王" ...

  2. 使用canvas上传图片+上传进度

    实现效果: 速度过快,调式浏览器方式:F12 后台java代码 public String imageshangchuan(@RequestPart("xxx") Multipar ...

  3. Android UI开发专题(转)

    http://dev.10086.cn/cmdn/bbs/viewthread.php?tid=18736&page=1#pid89255 Android UI开发专题(一) 之界面设计 近期 ...

  4. Android学习笔记_3_四种布局

    Android布局是应用界面开发的重要一环,在Android中,共有四种布局方式, 分别是:FrameLayout( 帧布局 ).LinearLayout (线性布局).TableLayout(表格布 ...

  5. Node.js 笔记01

    一.Node.js 前言 1.node.js 之父 Ryan Dahl(瑞安达尔) ,技术好,颜值高! 数学系博士, 中途退学, 为了生活, 学习了Ruby On Rails接Web项目, 经过两年成 ...

  6. sql树形查询

    sql: 使用Common As:递归公用表 https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expressi ...

  7. mac启动springboot失败,8080端口被占用,mac命令行关闭端口

    如下图,idea启动springboot失败,8080端口被占用 Error starting ApplicationContext. To display the conditions report ...

  8. linux简介及虚拟机安装

    1.简介 计算机组成

  9. spring(一)-基本概念

    1.定义与特点 定义:一个分模块的一站式后台开发框架. 特征: (1)比起EJB,更轻量级别的容器框架,模块形式组织,只需要调用相应模块(jdbc.springmvc) (2)Spring IOC低耦 ...

  10. java程序员所必须掌握的内容

    以下内容有待细化,并用于考察员工的水平! 从低的往高级的说. 初级 1.掌握java语法 oop+io+网络 2.基本的数据结构 3.基本的算法-例如排序,合并 4.基本的几个javaee框架 spr ...