Fliptile POJ 3279(反转)

原题

题目链接

题目分析

对于N行M列的矩阵,先看看左上角的点,能使该点翻转的有(1,1)、(1,2)和(2,1),无法确定该通过哪个点来翻转(1,1).不妨先确定好第一行的翻转情况,也就是说该不该翻(1,1)和(1,2)已经确定了,则此时只有(2,1)能翻转点(1,1),这时候就能直接判断了,因此可以确定第二行的翻转情况,同理迭代到最后一行,则整个矩阵的翻转情况都已确认完毕,此时只需要检验最后一行是否有黑色-1的即可.这里枚举第一行的翻转情况可用二进制枚举,则总的复杂度为O(N*M*2M).

代码

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <iostream>
  4 #include <algorithm>
  5 #include <utility>
  6 #include <ctime>
  7 #include <cmath>
  8 #include <cstring>
  9 #include <string>
 10 #include <stack>
 11 #include <queue>
 12 #include <vector>
 13 #include <set>
 14 #include <map>
 15
 16 using namespace std;
 17 typedef unsigned long long ULL;
 18 typedef long long LL;
 19 typedef long double LB;
 20 const int INF_INT=0x3f3f3f3f;
 21 const LL INF_LL=0x3f3f3f3f3f3f3f3f;
 22
 23 int N,M;
 24 int grid[15][15];
 25 int f[15][15];
 26
 27 bool check()
 28 {
 29     int t=N-1;
 30     int sum=f[t][0];
 31     for(int i=0;i<M;i++)
 32     {
 33         if(i-2>=0) sum-=f[t][i-2];
 34         if(t-1>=0)
 35         {
 36             sum+=f[t-1][i];
 37             if(i-1>=0) sum-=f[t-1][i-1];
 38         }
 39         if(i+1<M) sum+=f[t][i+1];
 40         if(sum&1)
 41         {
 42             if(!grid[t][i]) return false;
 43         }
 44         else
 45         {
 46             if(grid[t][i]) return false;
 47         }
 48     }
 49     return true;
 50 }
 51
 52 int main()
 53 {
 54 //    freopen("testdata.in","r",stdin);
 55 //  freopen("std.out","w",stdout);
 56     cin>>N>>M;
 57     for(int i=0;i<N;i++)
 58         for(int j=0;j<M;j++)
 59             cin>>grid[i][j];
 60     bool s=false;
 61     for(int i=0;i<(1<<M);i++)
 62     {
 63         for(int j=0;j<M;j++)
 64             f[0][j]=(i>>j)&1;
 65
 66         for(int j=0;j<N-1;j++)
 67         {
 68             int sum=f[j][0];
 69             for(int k=0;k<M;k++)
 70             {
 71                 if(k-2>=0) sum-=f[j][k-2];
 72                 if(j-1>=0)
 73                 {
 74                     sum+=f[j-1][k];
 75                     if(k-1>=0) sum-=f[j-1][k-1];
 76                 }
 77                 if(k+1<M) sum+=f[j][k+1];
 78                 if(sum&1)
 79                 {
 80                     if(grid[j][k]) f[j+1][k]=0;
 81                     else f[j+1][k]=1;
 82                 }
 83                 else
 84                 {
 85                     if(grid[j][k]) f[j+1][k]=1;
 86                     else f[j+1][k]=0;
 87                 }
 88             }
 89         }
 90         if(check())
 91         {
 92             s=true;
 93             break;
 94         }
 95     }
 96     if(s)
 97     {
 98         for(int i=0;i<N;i++)
 99         {
100             for(int j=0;j<M;j++)
101             {
102                 if(!j) printf("%d",f[i][j]);
103                 else printf(" %d",f[i][j]);
104             }
105             cout<<endl;
106         }
107     }
108     else printf("IMPOSSIBLE\n");
109     return 0;
110 }

原文地址:https://www.cnblogs.com/VBEL/p/11747366.html

时间: 2024-10-11 17:01:06

Fliptile POJ 3279(反转)的相关文章

Fliptile(POJ 3279)

原题如下: Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16494   Accepted: 6025 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows i

Enum:Fliptile(POJ 3279)

Fliptile 题目大意:农夫想要测牛的智商,于是他把牛带到一个黑白格子的地,专门来踩格子看他们能不能把格子踩称全白 这一题其实就是一个枚举题,只是我们只用枚举第一行就可以了,因为这一题有点像开关一样,一个翻了,另一个就要跟着一起翻,第一行会影响下面所有行,而且影响情况只有一种,所以枚举完了以后我们不断模拟就可以了 1 #include <iostream> 2 #include <functional> 3 #include <algorithm> 4 5 usin

Fliptile POJ - 3279(状态压缩)

题意:给你一个n * m的矩阵,元素为0/1, 求把所有的元素变成0所需要的最少操作.(每对一个格子操作,该十字格的元素反转) 分析:一看数据量 <= 15, 就有点状态压缩的感jio.从小到大枚举第一行的操作,因为第一行的操作决定了后面所有的操作,所以最后判断对于第一行的操作是不是符合题意即可. 代码: 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <

翻转问题 Fliptile POJ - 3279

Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which they manipulate an M × N grid (1 ≤ M ≤ 15; 1 ≤ N ≤ 15) of square tiles, each of which is colored black

D - Fliptile POJ - 3279

Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in which they manipulate an M × N grid (1 ≤ M ≤ 15; 1 ≤ N ≤ 15) of square tiles, each of which is colored black

POJ 3279(Fliptile)题解

以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定长宽的黑白棋棋盘摆满棋子,每次操作可以反转一个位置和其上下左右共五个位置的棋子的颜色,求要使用最少翻转次数将所有棋子反转为黑色所需翻转的是哪些棋子(这句话好长...). [题目分析] 盯着奇怪的题目看了半天发现和奶牛没什么卵关系..奶牛智商高了产奶高是什么鬼说法... 这题刚开始被放到搜索的分类下了..然而这和搜索有什么关系..没经验所以想了各种和搜索沾边的方法,结果没想出解法,直到看了网上的题解,压根不是搜索啊有木有.

状态压缩+枚举 POJ 3279 Fliptile

题目传送门 1 /* 2 题意:问最少翻转几次使得棋子都变白,输出翻转的位置 3 状态压缩+枚举:和之前UVA_11464差不多,枚举第一行,可以从上一行的状态知道当前是否必须翻转 4 */ 5 #include <cstdio> 6 #include <cstring> 7 #include <algorithm> 8 using namespace std; 9 10 const int MAXN = 20; 11 const int INF = 0x3f3f3f3

POJ 3279 Fliptile(DFS+反转)

题目链接:http://poj.org/problem?id=3279 题目大意:有一个n*m的格子,每个格子都有黑白两面(0表示白色,1表示黑色).我们需要把所有的格子都反转成黑色,每反转一个格子,它上下左右的格子都会跟着反转.请求出用最小步数完成反转时每个格子反转的次数.有多个解时,输出字典序最小的一组. 解题思路:只要枚举第一行的2^m种情况,如果一个位置上一行是1,那这个位置一定要反转,因为只有这一行能改变上一行,所以每一行的状态都是由前一行决定的.只要最后判断最后一行是不是都是0即可,

poj 3279 Fliptile (简单搜索)

Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 16558   Accepted: 6056 Description Farmer John knows that an intellectually satisfied cow is a happy cow who will give more milk. He has arranged a brainy activity for cows in whic