zoukankan      html  css  js  c++  java
  • poj3279 Fliptile

    思路:

    枚举。

    枚举了第一行的操作之后,下面每行的操作也随之确定了。因为在确定了第i行的操作之后,要想再改变a[i][j]的状态只能通过改变a[i + 1][j]来实现。另外,用到了集合的整数表示方法。

    实现:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 const int INF = 0x3f3f3f3f;
     5 const int dx[4] = {0, 1, 0, -1};
     6 const int dy[4] = {1, 0, -1, 0};
     7 int a[20][20], b[20][20], ans[20][20], buf[20][20], m, n;
     8 void turn(int x, int y)
     9 {
    10     b[x][y] = 1 - b[x][y];
    11     for (int i = 0; i < 4; i++)
    12     {
    13         int nx = x + dx[i], ny = y + dy[i];
    14         if (nx >= 0 && nx < m && ny >= 0 && ny < n)
    15         {
    16             b[nx][ny] = 1 - b[nx][ny];
    17         }
    18     }
    19 }
    20 int main()
    21 {
    22     cin >> m >> n;
    23     for (int i = 0; i < m; i++)
    24     {
    25         for (int j = 0; j < n; j++)
    26             cin >> a[i][j];
    27     }
    28     int minn = INF;
    29     for (int i = 0; i < (1 << n); i++)
    30     {
    31         int cnt = 0;
    32         memset(buf, 0, sizeof buf);
    33         for (int i = 0; i < m; i++)
    34         {
    35             for (int j = 0; j < n; j++)
    36             {
    37                 b[i][j] = a[i][j];
    38             }
    39         }
    40         for (int j = 0; j < n; j++)
    41         {
    42             int msk = 1 << j;
    43             if (i & msk)
    44             {
    45                 turn(0, j); cnt++; buf[0][j] = 1;
    46             }
    47         }
    48         for (int j = 1; j < m; j++)
    49         {
    50             for (int k = 0; k < n; k++)
    51             {
    52                 if (b[j - 1][k]) 
    53                 {    
    54                     turn(j, k); cnt++; buf[j][k] = 1;
    55                 }
    56             }
    57         }
    58         bool flg = true;
    59         for (int i = 0; i < n; i++)
    60         {
    61             if (b[m - 1][i]) { flg = false; break; }
    62         }
    63         if (flg && cnt < minn) 
    64         {
    65             minn = cnt;
    66             for (int i = 0; i < m; i++)
    67             {
    68                 for (int j = 0; j < n; j++)
    69                 {
    70                     ans[i][j] = buf[i][j];
    71                 }
    72             }
    73         }
    74     }
    75     if (minn == INF) cout << "IMPOSSIBLE" << endl;
    76     else
    77     {
    78         for (int i = 0; i < m; i++)
    79         {
    80             for (int j = 0; j < n; j++)
    81                 cout << ans[i][j] << " ";
    82             cout << endl;
    83         }
    84     }
    85     return 0;
    86 }
  • 相关阅读:
    几何变换
    图片移动、旋转、resize、
    load、display、save
    java基础—java三大集合ArrayList、HashSet、HashMap
    java基础—修饰符、抽象类、接口
    java基础——转义字符
    java基础—String类型常用api
    Python中 sys.argv[]的用法
    Java—this关键字
    在CMD中运行Python文件
  • 原文地址:https://www.cnblogs.com/wangyiming/p/7620484.html
Copyright © 2011-2022 走看看