POJ 3279 Fliptile 状态压缩,思路 难度:2
http://poj.org/problem?id=3279
明显,每一位上只需要是0或者1,
遍历第一行的所有取值可能,(1<<15,时间足够)对每种取值可能:
对于第0-n-2行,因为上一行和本身行都已确定,所以可以确定下一行
最后检查第n-1行是否满足条件即可
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int maz[15][15];
int op[15][15];
int ans[15][15],mn;
int n,m;
void getop(int sta){
memset(op,0,sizeof(op));
for(int i=0;i<n;i++){
if(sta&(1<<i)){
op[0][i]=1;
}
}
}
int getone(){
int num=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
num+=op[i][j];
}
}
return num;
}
const int dx[4]={0,-1,0,0};
const int dy[4]={0,0,1,-1};
bool in(int x,int y){
return x>=0&&x<n&&y>=0&&y<m;
}
bool judge(int x,int y){
int num=maz[x][y];
for(int i=0;i<4;i++){
int tx=x+dx[i],ty=y+dy[i];
if(in(tx,ty))num+=op[tx][ty];
}
return (num&1)==0;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",maz[i]+j);
int mn=0x7ffffff;
for(int sta=0;sta<(1<<n);sta++){
getop(sta);
for(int i=0;i<n-1;i++){
for(int j=0;j<m;j++){
if(!judge(i,j)){
op[i+1][j]=1;
}
}
}
bool fl=true;
for(int j=0;j<m;j++){
if(!judge(n-1,j)){
fl=false;
break;
}
}
if(fl){
int num=getone();
if(num<mn){
for(int i=0;i<n;i++){
copy(op[i],op[i]+m,ans[i]);
}
mn=num;
}
}
}
if(mn<=n*m)
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d%c",ans[i][j],j==m-1?'\n':' ');
}
}
else puts("IMPOSSIBLE"); return 0;
}
POJ 3279 Fliptile 状态压缩,思路 难度:2的更多相关文章
- 状态压缩+枚举 POJ 3279 Fliptile
题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- poj 3311(状态压缩DP)
poj 3311(状态压缩DP) 题意:一个人送披萨从原点出发,每次不超过10个地方,每个地方可以重复走,给出这些地方之间的时间,求送完披萨回到原点的最小时间. 解析:类似TSP问题,但是每个点可以 ...
- poj 1185(状态压缩DP)
poj 1185(状态压缩DP) 题意:在一个N*M的矩阵中,‘H'表示不能放大炮,’P'表示可以放大炮,大炮能攻击到沿横向左右各两格,沿纵向上下各两格,现在要放尽可能多的大炮使得,大炮之间不能相互 ...
- poj 3254(状态压缩DP)
poj 3254(状态压缩DP) 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相 ...
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- 【POJ 3279 Fliptile】开关问题,模拟
题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...
- poj 3311(floyd+状态压缩)
题目链接:http://poj.org/problem?id=3311 思路:Floyd + 状态压缩DP 题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且 ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
随机推荐
- jQuery Form
https://github.com/jquery-form/form#type 概念 jQuery表单插件允许您轻松,无差错地升级HTML表单以使用AJAX. 主要方法ajaxForm和ajaxSu ...
- android唯一设备标识、设备号、设备ID的获取方法
##如何获取Android设备唯一ID? ###问题 每一个android设备都有唯一ID吗?如果有?怎么用java最简单取得呢? ###回答1(最佳) 如何取得android唯一码? 好处: 1.不 ...
- Windows mysql默认字符集修改
一.通过MySQL命令行修改: set character_set_client=utf8; set character_set_connection=utf8; set character_set_ ...
- (转)SpringBoot非官方教程 | 第三篇:SpringBoot用JdbcTemplates访问Mysql
本文介绍springboot通过jdbc访问关系型MySQL,通过spring的JdbcTemplate去访问. 准备工作 jdk 1.8 maven 3.0 idea mysql 初始化mysql: ...
- Visual Studio Code常用设置
Visual Studio Code常用设置 • 自动保存设置 ▶ 文件(F) -> 首选项(P) -> 用户设置(U) ▶ 将"files.autoSave": &q ...
- curl获取远程文件内容
curl获取远程文件内容 ** 获取远程文件内容 @param $url 文件http地址 * function fopen_url($url) { if (function_exists(& ...
- cocos-lua基础学习(四)quick层封装后的目录结构
命名空间 cc cocos2d核心类 ccb cocosbuilder扩展 ccs cocostudio扩展 cocos2d目录结构 bitExtend.lua cocos2d.lua cocos2d ...
- pyDay11
内容来自廖雪峰的官方网站. 1.杨辉三角generator: def triangles(): L = [1] while True: yield L L.append(0) L = [L[i-1] ...
- linux 导入导出mysql相关问题
linux 导入mysql报错 CREATE DATABASE `mmm` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE D ...
- EL表达式判断条件要写在${}内
由于老没开发框架了,今天提取公共省市县三级联动组件时,使用jsp传参搞了半天才弄出来. 组件代码 $(function(){console.log("${param.init}") ...