题意:一个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的更多相关文章

  1. POJ 3279 Fliptile(翻格子)

    POJ 3279 Fliptile(翻格子) Time Limit: 2000MS    Memory Limit: 65536K Description - 题目描述 Farmer John kno ...

  2. POJ.3279 Fliptile (搜索+二进制枚举+开关问题)

    POJ.3279 Fliptile (搜索+二进制枚举+开关问题) 题意分析 题意大概就是给出一个map,由01组成,每次可以选取按其中某一个位置,按此位置之后,此位置及其直接相连(上下左右)的位置( ...

  3. 状态压缩+枚举 POJ 3279 Fliptile

    题目传送门 /* 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 */ #include < ...

  4. POJ 3279(Fliptile)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑 ...

  5. poj 3279 Fliptile (简单搜索)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16558   Accepted: 6056 Descrip ...

  6. 【POJ 3279 Fliptile】开关问题,模拟

    题目链接:http://poj.org/problem?id=3279 题意:给定一个n*m的坐标方格,每个位置为黑色或白色.现有如下翻转规则:每翻转一个位置的颜色,与其四连通的位置都会被翻转,但注意 ...

  7. POJ 3279 Fliptile[二进制状压DP]

    题目链接[http://poj.org/problem?id=3279] 题意:给出一个大小为M*N(1 ≤ M ≤ 15; 1 ≤ N ≤ 15) 的图,图中每个格子代表一个灯泡,mp[i][j] ...

  8. 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 ...

  9. POJ - 3279 Fliptile (枚举)

    http://poj.org/problem?id=3279 题意 一个m*n的01矩阵,每次翻转(x,y),那么它上下左右以及本身就会0变1,1变0,问把矩阵变成全0的,最小需要点击多少步,并输出最 ...

  10. poj 3279 Fliptile(二进制)

    http://poj.org/problem?id=3279 在n*N的矩阵上,0代表白色,1代表黑色,每次选取一个点可以其颜色换过来,即白色变成黑色,黑色变成白色,而且其上下左右的点颜色也要交换,求 ...

随机推荐

  1. iOS工程中的info.plist文件

    我们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除. 如果你在网上下载 ...

  2. CNKI翻译助手-连接数据库失败

    IP并发数限制,老师说西工大的CNKI才20个并发指标,HPU自不必说.但是我略表怀疑,这只是翻译助手而已,就像百度翻译和百度数据库的区别,如何验证呢?去校外用该助手,如果能用,那么就不是IP并发限制 ...

  3. CSRF防范策略研究

    目录 0x1:检查网页的来源 0x2:检查内置的隐藏变量 0x3:用POST不用GET 检查网页的来源应该怎么做呢?首先我们应该检查$_SERVER[“HTTP_REFERER”]的值与来源网页的网址 ...

  4. uva 10306

    有点不同的完全背包问题  但思路还是一样的 /************************************************************************* > ...

  5. linux ln命令 创建链接(快捷方式)

    命令格式: ln -s 目标地址 链接名称 # 假设/home目录下有wuyou文件夹,你要在当前目录创建一个链接指向它 $ ln -s /home/wuyou wuyou_link

  6. [itint5]堆放积木

    先按照一维排序,然后在第二维求最大上升子序列.注意比较的时候还要考虑第一维虽然排序,还是有可能相等的. bool comp(const Box &a, const Box &b) { ...

  7. ecos内核概览--bakayi译

    http://blog.csdn.net/wangzaiwei2006/article/details/6453423

  8. 如何用Java语言向串口读写数据

    原作者:赛迪网作者 shihuchen ,我在他的基础上进行了部分修改 [赛迪网讯]串口, RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA ...

  9. 杭电ACM(1002) -- A + B Problem II 大数相加 -提交通过

    杭电ACM(1002)大数相加 A + B Problem II Problem DescriptionI have a very simple problem for you. Given two ...

  10. Qt: qobject_cast<QPushButton*>(sender()) 简化信号与槽的编写

    当你觉得写代码是一件重复性极高的工作时,这时你就应该考虑换个方式来实现了. 提高代码效率,减少代码量. 代码片: void Widget::onClicked() { QPushButton* but ...