Fliptile 翻格子游戏[Usaco2007 Open]
题目描述
Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which they manipulate an M x N grid (1 <= M <= 15; 1 <= N <= 15) of square tiles, each of which is colored black on one side and white on the other side. As one would guess, when a single white tile is flipped, it changes to black; when a single black tile is flipped, it changes to white. The cows are rewarded when they flip the tiles so that each tile has the white side face up. However, the cows have rather large hooves and when they try to flip a certain tile, they also flip all the adjacent tiles (tiles that share a full edge with the flipped tile). Since the flips are tiring, the cows want to minimize the number of flips they have to make. Help the cows determine the minimum number of flips required, and the locations to flip to achieve that minimum. If there are multiple ways to achieve the task with the minimum amount of flips, return the one with the least lexicographical ordering in the output when considered as a string. If the task is impossible, print one line with the word "IMPOSSIBLE".
输入
* Line 1: Two space-separated integers: M and N
* Lines 2..M+1: Line i+1 describes the colors (left to right) of row i of the grid with N space-separated integers which are 1 for black and 0 for white
输出
* Lines 1..M: Each line contains N space-separated integers, each specifying how many times to flip that particular location.
样例输入
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 OUTPUT DETAILS:
After flipping at row 2 column 1, the board will look like:
0 0 0 1
1 0 1 0
1 1 1 0
1 0 0 1
After flipping at row 2 column 4, the board will look like:
0 0 0 0
1 0 0 1
1 1 1 1
1 0 0 1
After flipping at row 3 column 1, the board will look like:
0 0 0 0
0 0 0 1
0 0 1 1
0 0 0 1 After flipping at row 3 column 4, the board will look like:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0 Another solution might be:
0 1 1 0
0 0 0 0
0 0 0 0
0 1 1 0
but this solution is lexicographically higher than the solution above. 题解
一眼以为是喜闻乐见的每日大暴搜,然后就开心地开始画。这个东西和翻的先后无关,而且每个点翻两次就翻回去了,只会有0和1两种情况。直接按字典序从小到大翻不翻枚举,得到第一个可行解就停止搜索,没有想清楚“步数最少”到底是不是题目要求。稍微剪了剪枝,就直接这么放着了。搜索复杂度比较玄学,也没仔细想,天真地以为这样就差不多了。
所以说我这么信任你你居然是个状压?用二进制枚举第一行的操作,正如《分手是祝愿》一样,每个点被翻偶数次状态与原来相同。用一个矩阵记录一下每个位置被改变了多少次,在翻下一行时要求上一行全部为0,而能改变的上一行只有正对的那个,所以下一行的操作也是可以确定的。推到最后一行,这一系列操作真正正确与否就可以验证了,看它是否使最后一行全部变为0。当搜出了一个可行解,它固然字典序很小,但还要比较操作次数,并且以操作次数小的优先(话说字典序大多数情况下都是用来优中选优的),所以无论如何都要在第一行枚举所有状态。
昨天找规律,今天递推,正解还真是五花八门多种多样丰富多彩惊世骇俗啊……然而真正的dalao们还是能想到解决问题的办法。存在即合理,有题目就会有解法,有偏差就会有错误,我们总是得相信些什么,有所相信才能走下去。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans[],a[][],n,m,bf[][],res[],mi,ge;
bool jg,cl;
void init()
{
scanf("%d%d",&m,&n);
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
mi=m*n+;
}
void dt()
{
for(int j=n-;j>=;j--)
if(ans[]&(<<j))
{
bf[][n-j]++;
bf[][n-j-]++;
bf[][n-j+]++;
bf[][n-j]++;
}
for(int i=;i<=m;i++)
for(int j=;j<=n;j++)
if((bf[i-][j]&)!=a[i-][j])
{
ans[i]|=(<<(n-j));
bf[i][j]++;
bf[i][j+]++;
bf[i][j-]++;
bf[i+][j]++;
}
cl=;
for(int j=;j<=n;j++)
if((bf[m][j]&)!=a[m][j])
{
cl=;
break;
}
}
int main()
{
init();
for(int i=;i<=(<<n)-;i++)
{
memset(bf,,sizeof(bf));
memset(ans,,sizeof(ans));
ans[]=i;
dt();
if(cl)
{
jg=;
ge=;
for(int k=;k<=m;k++)
for(int j=;j<n;j++)
if(ans[k]&(<<j)) ge++;
if(ge<mi)
{
for(int k=;k<=m;k++)
res[k]=ans[k];
mi=ge;
}
}
}
if(jg)
for(int i=;i<=m;i++)
{
for(int j=n-;j>;j--)
{
if(res[i]&(<<j)) printf("1 ");
else printf("0 ");
}
if(res[i]&) printf("1\n");
else printf("0\n");
}
if(!jg) printf("IMPOSSIBLE");
return ;
}
fliptile
食堂知道,那些疲惫又难过的OIer吃得特别多,所以他们很喜欢大暴搜……
Fliptile 翻格子游戏[Usaco2007 Open]的更多相关文章
- 1647: [Usaco2007 Open]Fliptile 翻格子游戏
1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 423 Solved: 173[ ...
- [Usaco2007 Open]Fliptile 翻格子游戏
[Usaco2007 Open]Fliptile 翻格子游戏 题目 Farmer John knows that an intellectually satisfied cow is a happy ...
- [Usaco2007 Open]Fliptile 翻格子游戏题解
问题 B: [Usaco2007 Open]Fliptile 翻格子游戏 时间限制: 5 Sec 内存限制: 128 MB 题目描述 Farmer John knows that an intell ...
- Fliptile 翻格子游戏
问题 B: [Usaco2007 Open]Fliptile 翻格子游戏 时间限制: 5 Sec 内存限制: 128 MB 题目描述 Farmer John knows that an intell ...
- [BZOJ 1647][USACO 2007 Open] Fliptile 翻格子游戏
1647: [Usaco2007 Open]Fliptile 翻格子游戏 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 702 Solved: 281[ ...
- [Usaco2007 Open]Fliptile 翻格子游戏 状态压缩
考试想到了状压,苦于T1废掉太长时间,于是默默输出impossible.. 我们知道,一个格子的翻转受其翻转次数和它相邻翻转次数的影响. 由每一个位置操作两次相当于把它翻过来又翻回去,所以答案中每一个 ...
- 【BZOJ】1647: [Usaco2007 Open]Fliptile 翻格子游戏(暴力)
http://www.lydsy.com/JudgeOnline/problem.php?id=1647 自己太弱...看题解.. 竟然是枚举第一行的放法,,,因为一定要全部变0,所以将前一行1的在这 ...
- 【BZOJ 1647】[Usaco2007 Open]Fliptile 翻格子游戏 模拟、搜索
第一步我们发现对于每一个格子,我们只有翻和不翻两种状态,我们发现一旦确定了第一行操作,那么第二行的操作也就随之确定了,因为第一行操作之后我们要想得到答案就得把第一行全部为0,那么第二行的每一个格子的操 ...
- BZOJ 1647 [Usaco2007 Open]Fliptile 翻格子游戏:部分枚举 位运算
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1647 题意: 在一个n*m(1 <= n,m <= 15)的棋盘上,每一个格子 ...
随机推荐
- printf和scanf整理(后续填补)
scanf和printf头文件:<stdio.h> 1.%d.%3d.%03d.%-3d区分 %d:以十进制形式输出整数(int) %3d:指定宽度为3,不足的左边补空格 %03d:一种左 ...
- java源码学习(二)Integer
Integer类包含了一个原始基本类型int.Integer属性中就一个属性,它的类型就是int. 此外,这个类还提供了几个把int转成String和把String转成int的方法,同样也提供了其它跟 ...
- Python----Windows环境下安装Flask
Flask是Python中web开发的一个轻框架,掌握起来比较简单,想体验一下,先从安装Flask开始. 我是在Widows环境下安装的Flask,在Linux环境下也一样,无非就是安装几个依赖和开发 ...
- 记一次linux主机名莫名其妙变成了bogon
起因:公司网络接口做了接口认证,虚拟机桥接至物理网卡无法完成认证进行网络访问,无奈之下只能讲虚拟机网络模式更改为NAT模式,更改完成之后进行ssh登录,发现主机名发生了变化. 更改NAT模式之前 [r ...
- linux开机启动smb服务
修改/etc/rc.local文件(增加红色部分) [root@localhost ~]# cat /etc/rc.local #!/bin/sh## This script will be exec ...
- css之选择器总结
首先我们来看下有哪些选择器??? 一.基础选择器: html标签选择器:通过html标签来选择元素. ①所有的html标签都可以当做选择器. ②无论标签藏多深都会被选中. ③选择的是所有的标签而不是某 ...
- 既然函数也是对象,那么为什么this不指向普通函数?
function a(){ var b=1; function exp(){ alert(this.b); } exp(); } var b=2; a(); 既然函数是对象,且exp是在a中运行的,那 ...
- 7.如何发布vue项目到服务器
1.确保程序是可运行的,即npm run dev可以运行 2.把index.js修改 3.运行npm命令npm run build 4.生成的dist文件为 直接点击index.html就能运行,部署 ...
- 【原创】 Docker 中 运行 ASP.NET Core 站点
一. 建立 .NetCore 项目 a.新建项目 b.选择项目类型 c.添加控制器 d.添加视图 e.修改默认请求 f.发布 二. 准备 CentOS 环境 a.准备虚拟机 b.安装 docker ...
- vijos1034题解
题目: 若某个家族人员过于庞大,要判断两个是否是亲戚,确实还很不容易,现在给出某个亲戚关系图,求任意给出的两个人是否具有亲戚关系. 规定:x和y是亲戚,y和z是亲戚,那么x和z也是亲戚.如果x,y是亲 ...