题意:一个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. 软件测试 -- 软件缺陷记录的5C原则

    Correct(准确):每个组成部分的描述准确,不会引起误解: Clear(清晰):每个组成部分的描述清晰,易于理解: Concise(简洁):只包含必不可少的信息,不包括任何多余的内容: Compl ...

  2. 【BZOJ 2440】[中山市选2011]完全平方数

    Description 小 X 自幼就很喜欢数.但奇怪的是,他十分讨厌完全平方数.他觉得这些数看起来很令人难受.由此,他也讨厌所有是完全平方数的正整数倍的数.然而这丝毫不影响他对其他数的热爱. 这天是 ...

  3. 读书笔记汇总 --- 用Python写网络爬虫

    本系列记录并分享:学习利用Python写网络爬虫的过程. 书目信息 Link 书名: 用Python写网络爬虫 作者: [澳]理查德 劳森(Richard Lawson) 原版名称: web scra ...

  4. C# Windows - ListView

    ListView控件的属性 属性 说明 Activation 控制用户在列表视图中激活选项的方式Standard - 用户为自己的计算机选择的值OneClick – 单击一个选项,激活它TwoClic ...

  5. java和php实现RSA加密互通-b

    java和PHP RSA加密实现互通 1:通过openssl 生成公钥和密钥文件(linux) (1)  生产私钥文件命令 openssl genrsa -out rsa_private_key.pe ...

  6. Castle ActiveRecord简单介绍

    Castle ActiveRecord框架是一个基于.NET的ORM框架,它实现了ActiveRecord设计模式.它本身就是基于NHibernate,只是封 装了NHibernate的大部分烦杂细节 ...

  7. Apache2.2+php5.4在windows上配置实例

    这几天一直在win8.1上配置apache+php环境,网上看了很多文章,自己又犯了很多错误才配置成功,对新手来说真是有点小难. 自己打算把配置的详细过程写下来,好帮助其他新手快速配置. 在这里参考了 ...

  8. org.hibernate.LazyInitializationException

    1.org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.c ...

  9. 【扩展欧几里得】Codevs 1200: [noip2012]同余方程

    Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空格隔开. Outpu ...

  10. List<T> 排序

    List<T>的排序 List<DataPoint> dataPointsDataPints = ...; //按RegisterAddress升序排序 dataPointsD ...