• uva 11464 Even Parity


    https://vjudge.net/problem/UVA-11464

    题意:

    给出一个0,1矩阵,现在要求把这个矩阵中的某些0改为1,使得这个矩阵中每个格子的上下左右格子(如果存在)的值之和为偶数,问最少的改变次数,不能达到要求输出-1。

    思路:

    其实,只要第一行的状态定了,接下来所有行的状态就已经定了,这是经过手算得出的结果。根据一个格子的上左右的值之和,就可以确定它下面的格子的状态。

    那么,只需要枚举第一行的状态就可以了,用二进制枚举的方法。

    接下来,判断这个矩阵是否满足要求,注意的地方是,如果说原矩阵中为1的在改变后的矩阵中为0,那么这个肯定是不符合要求的,因为只能把0改为1,不能把1改为0。

    代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 int a[20][20];
     7 int b[20][20];
     8 
     9 int main()
    10 {
    11     int t;
    12 
    13     scanf("%d",&t);
    14 
    15     int cas =0 ;
    16 
    17     while (t--)
    18     {
    19         int n;
    20 
    21         scanf("%d",&n);
    22 
    23         for (int i = 0;i < n;i++)
    24             for (int j = 0;j < n;j++)
    25             scanf("%d",&a[i][j]);
    26 
    27         int k = (1 << n);
    28 
    29         int ans = 1000000;
    30 
    31         for (int i = 0;i < k;i++)
    32         {
    33             for (int j = 0;j < n;j++)
    34             {
    35                 if ((1 << j) & i) b[0][j] = 1;
    36                 else b[0][j] = 0;
    37             }
    38 
    39             for (int x = 0;x < n - 1;x++)
    40                 for (int y = 0;y < n;y++)
    41             {
    42                 int sum = 0;
    43 
    44                 if (x - 1 >= 0) sum += b[x-1][y];
    45                 if (y - 1 >= 0) sum += b[x][y-1];
    46                 if (y + 1 < n) sum += b[x][y+1];
    47 
    48                 if (sum & 1) b[x+1][y] = 1;
    49                 else b[x+1][y] = 0;
    50             }
    51 
    52             int tmp = 0;
    53 
    54             bool f = 0;
    55 
    56             for (int x = 0;x < n;x++)
    57                 for (int y = 0;y < n;y++)
    58             {
    59 
    60                 if (f) break;
    61 
    62                 if (a[x][y] == 0 && b[x][y] == 1)
    63                 {
    64                     tmp++;
    65                 }
    66                 else if (a[x][y] == 1 && b[x][y] == 0)
    67                 {
    68                     f = 1;
    69                     break;
    70                 }
    71             }
    72 
    73 
    74             if (f) continue;
    75             else ans = min(ans,tmp);
    76         }
    77 
    78         if (ans == 1000000)
    79         {
    80             printf("Case %d: %d
    ",++cas,-1);
    81         }
    82         else printf("Case %d: %d
    ",++cas,ans);
    83     }
    84 
    85     return 0;
    86 }
  • 相关阅读:
    AndroidStudio 混淆打包
    android监听键盘
    Emoji字符检查与替换
    自定义Toast样式-两行文本居中显示
    强密码验证的正则表达式
    图片处理之-Bitmap.Config,jpeg压缩与大小
    Android App开之标注切图
    Android基础之CountDownTimer 倒计时类
    Android Handler Leak
    单目标跟踪CVPR 2018 ECO+
  • 原文地址:https://www.cnblogs.com/kickit/p/7592780.html
Copyright © 2020-2023  润新知