Fliptile [POJ3279] [开关问题]
题意
给定一张n*m的方格图,有1,0两种数字,每次可以选取一个十字进行翻转,1变成0,0变成1,问最少需要翻转几次,使它全部变成0,全部如果有重复的,按字典序最小的进行输出;
输入
第一行n,m
下面一个矩阵,代表方格图
输出
按矩阵原格式输出是否需要翻转
Sample Input
4 4
1 0 0 1
0 1 1 0
0 1 1 0
1 0 0 1
Sample Output
0 0 0 0
1 0 0 1
1 0 0 1
0 0 0 0
分析
这道题也是一个开关问题,但是相对于上一题(我博客的上一题[POJ3276]),显然这是个二维的矩阵了,调整一个会对四面八方有影响,这样就不能确定地做一件操作的。我们要想着如何变成一个有固定操作规律的方法。看数据也许能启发我们,因为N只有15,可能跟搜索有关。我们有以往的例子,在列用dfs枚举,在行就可以直接操作/DP。针对这个题,发现如果第一行确定了,第一行的某个值确定了,就只有它正下方的数字影响它,这样就可以确定下一行的翻转情况。以此类推,检验最后一行即可。
代码
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define RG register int
#define rep(i,a,b) for(RG i=a;i<=b;++i)
#define per(i,a,b) for(RG i=a;i>=b;--i)
#define ll long long
#define inf (1<<29)
#define maxn 20
using namespace std;
int n,m,ans=inf;
int num[maxn][maxn],gra[maxn][maxn],tag[maxn][maxn],rec[maxn],an[maxn][maxn];
inline int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void modify(int i,int j){gra[i][j]^=,gra[i-][j]^=,gra[i][j-]^=,gra[i+][j]^=,gra[i][j+]^=;}
int p;
void judge()
{
memset(tag,,sizeof(tag));
rep(i,,n)rep(j,,m) gra[i][j]=num[i][j];
rep(i,,m) if(rec[i]) tag[][i]=,modify(,i);
rep(i,,n)
rep(j,,m)
if(gra[i-][j])
modify(i,j),tag[i][j]=;
rep(j,,m) if(gra[n][j]) return;
int sum=;
rep(i,,n)rep(j,,m) sum+=tag[i][j];
if(sum<=ans)
{
ans=sum;
rep(i,,n)rep(j,,m) an[i][j]=tag[i][j];
}
} void dfs(int step)
{
if(step>m){judge();return;}
rec[step]=;dfs(step+);
rec[step]=;dfs(step+);
} int main()
{
n=read(),m=read();
rep(i,,n)rep(j,,m) num[i][j]=read();
dfs();
if(ans==inf)puts("IMPOSSIBLE");
else {rep(i,,n){rep(j,,m) printf("%d ",an[i][j]);puts("");}}
return ;
}
Fliptile [POJ3279] [开关问题]的更多相关文章
- [POJ3279]Fliptile(开关问题,枚举)
题目链接:http://poj.org/problem?id=3279 题解:http://www.cnblogs.com/helenawang/p/5538547.html /* ━━━━━┒ギリギ ...
- Fliptile POJ-3279 DFS
题目链接:Fliptile 题目大意 有一个01矩阵,每一次翻转(0->1或者1->0)一个元素,就会把与他相邻的四个元素也一起翻转.求翻转哪些元素能用最少的步骤,把矩阵变成0矩阵. 思路 ...
- POJ3279(开关后续)
描述: 一个\(n*m的矩阵,每个格子有0和1两种状态.每次可以翻一个格子,并且此格子的上下左右都要被翻.\) \(目标状态应该全为0,求最少翻的次数,输出最小字典序的方案\) 这儿可就麻烦了啊,开关 ...
- 【POJ 3279 Fliptile】开关问题,模拟
题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...
- POJ 3279 Fliptile ( 开关问题)
题目链接 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give ...
- POJ--3279(开关问题2个不同时间写的代码)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19730 Accepted: 7118 Descrip ...
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- Fliptile 开关问题 poj 3279
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4031 Accepted: 1539 Descript ...
- (POJ-3279)Fliptile (dfs经典---也可以枚举)
Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He ha ...
随机推荐
- c#根据文件路径启动进程
//根据文件路径启动进程 private static void StartProcessByFilePath(string path) { Process p = new System.Diagno ...
- [物理学与PDEs]第1章第9节 Darwin 模型 9.2 Maxwell 方程组的一个定解问题
设 $\Omega$ 为一有界区域, 外部为理想导体 $(\sigma=+\infty)$, 则 $\Omega$ 中电磁场满足 Maxwell 方程组 $$\beex \bea \ve\cfrac{ ...
- 使用kqueue的str_cli函数
void str_cli(FILE *fp, int sockfd) { , isfile; char buf[MAXLINE]; ]; struct timespec ts; struct stat ...
- IDEA15 下运行Scala遇到问题以及解决办法
为了让Scala运行起来还是很麻烦,为了大家方便,还是记录下来: 1.首先我下载的是IDEA的社区版本,版本号为15. 2.下载安装scala插件: 2.1 进入设置菜单. 2.2 点击安装JetBr ...
- C#多态及接口
直接看代码吧 using System; using static System.Console; namespace ConsoleApp { //使用abstract,抽象类或方法,不能使用vir ...
- Django详细流程
一.设计表结构 我们以学生管理系统为例,讲解一下Django的基本操作.首先要设计一下表的结构,这里就不多解释 班级表结构: 表名:grades 字段:班级名称 gname 成立时间 gdate 女生 ...
- 激活函数——tanh函数(理解)
0 - 定义 $tanh$是双曲函数中的一个,$tanh()$为双曲正切.在数学中,双曲正切“$tanh$”是由基本双曲函数双曲正弦和双曲余弦推导而来. $$tanhx=\frac{sinhx}{co ...
- MySQL问题汇总
1.中文乱码 连接设置: 数据库设置:
- 【sklearn】中文文档
看不见的叫做远方 飞机票 分类 回归 聚类 降维 模型选择 预处理
- 如何在python脚本下启动django程序
直接上图