poj 3279 Fliptile
题意:一个n * m的棋盘,0或1,每次改变一个格子时同时改变上下左右的格子,问用最少次数将棋盘全变成0的策略。
题解:用二进制压缩第一行更改的状态,之后遍历棋盘,如果当前格子为1则改变下方的格子,记录改变次数最小的状态为ans,最后模拟一次ans状态时的策略并输出。
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<limits.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define LL long long
using namespace std;
int dir[4][2] = {1, 0, 0, -1, 0, 1, -1, 0};
int n, m;
void change(int MAP[20][20], int i, int j)
{
MAP[i][j] = !MAP[i][j];
for(int k = 0; k < 4; k++)
{
int ti = i + dir[k][0], tj = j + dir[k][1];
if(ti > -1 && tj > -1 && ti < n && tj < m)
MAP[ti][tj] = !MAP[ti][tj];
}
}
int solve(int Map[20][20], int cse)
{
int MAP[20][20];
memcpy(MAP, Map, sizeof MAP);
int res = 0;
int tmp = 0;
while(cse)
{
if(cse & 1)
{
change(MAP, 0, tmp);
res++;
}
tmp++;
cse >>= 1;
}
for(int i = 0; i < n - 1; i++)
{
for(int j = 0; j < m; j++)
{
if(MAP[i][j])
{
change(MAP, i + 1, j);
res++;
}
}
}
for(int i = 0; i < m; i++)
if(MAP[n - 1][i])
return -1;
return res;
}
int main()
{
while(~scanf("%d%d", &n, &m))
{
int MAP[20][20];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
scanf("%d", &MAP[i][j]);
int cse = 1 << m;
int minn = 10000;
int ans = 0;
for(int i = 0; i < cse; i++)
{
int res = solve(MAP, i);
if(res != -1 && res < minn)
{
minn = res;
ans = i;
}
}
if(minn == 10000)
{
puts("IMPOSSIBLE");
continue;
}
int prt[20][20] = {0};
int tmp = 0;
while(ans)
{
if(ans & 1)
{
change(MAP, 0, tmp);
prt[0][tmp] = 1;
}
tmp++;
ans >>= 1;
}
for(int i = 0; i < n - 1; i++)
{
for(int j = 0; j < m; j++)
{
if(MAP[i][j])
{
change(MAP, i + 1, j);
prt[i + 1][j] = 1;
}
}
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
if(j)
printf(" ");
printf("%d", prt[i][j]);
}
puts("");
}
}
return 0;
}
poj 3279 Fliptile的更多相关文章
- POJ 3279 Fliptile(翻格子)
POJ 3279 Fliptile(翻格子) Time Limit: 2000MS Memory Limit: 65536K Description - 题目描述 Farmer John kno ...
- POJ.3279 Fliptile (搜索+二进制枚举+开关问题)
POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...
- 状态压缩+枚举 POJ 3279 Fliptile
题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...
- POJ 3279(Fliptile)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...
- poj 3279 Fliptile (简单搜索)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16558 Accepted: 6056 Descrip ...
- 【POJ 3279 Fliptile】开关问题,模拟
题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...
- POJ 3279 Fliptile[二进制状压DP]
题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...
- POJ 3279 - Fliptile - [状压+暴力枚举]
题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...
- POJ - 3279 Fliptile (枚举)
http://poj.org/problem?id=3279 题意 一个m*n的01矩阵,每次翻转(x,y),那么它上下左右以及本身就会0变1,1变0,问把矩阵变成全0的,最小需要点击多少步,并输出最 ...
- poj 3279 Fliptile(二进制)
http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...
随机推荐
- 解决ora-01652无法通过128(在表空间temp中)扩展temp段
问题描述: 今天建索引的时候报:ora-01652无法通过128(在表空间temp中)扩展temp段 1.查看表空间是自动增长,且建表空间时是没有设表空间最大值的. 2.查看了一下表空间剩余多少竟然只 ...
- Weblogic12c安装与配置详解
Weblogic是什么Weblogic的安装Weblogic创建域Weblogic管理域Weblogic的应用Weblogic是什么 Weblogic这是我入职以后第一次接触到的词汇,我很陌生,就从我 ...
- Eat the Trees hdu 1693
Problem DescriptionMost of us know that in the game called DotA(Defense of the Ancient), Pudge is a ...
- js添加创建节点和合并节点
var _div = document.createElement("div"), //创建节点 txt1 = document.createTextNode("123& ...
- 设置Cookie
var Site=new Object(); Site.Cookie={ _expires:24*3600*1000, _domain:'.gdxxb.com', set:function(name, ...
- 单链表反转的递归实现(Reversing a Linked List in Java, recursively)
转自Reversing a Linked List in Java, recursively There's code in one reply that spells it out, but you ...
- 一个只需要点 「下一步」就完成监控 Windows
Cloud Insight 此前已然支持 Linux 操作系统,支持20多中数据库中间件等组件,多种操作,多种搭配,服务器监控玩的其乐无穷啊!但想想还有许多 Windows 的小伙伴没有体验过,所以在 ...
- Java 另一道构造器与构造器重载的题目
题目: 请写出以下程序的输出结果 public class ConstructorTest2 { public static void main(String[] args) { new B(&quo ...
- 使用PHP抓取网站ico图标
网站许久没用更新,以后会经常更新,本次分享一个使用PHP抓取网站ico的程序,提供一个网站列表后对网站的ico进行下载抓取,具体代码如下: <?php /** * 更新热站ico * gao 2 ...
- AOSP
定义编辑 "Android Open-Source Project"的缩写 中文意为"Android 开放源代码项目" 内容编辑 在Android Open-S ...