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\n",++cas,-1);
81         }
82         else printf("Case %d: %d\n",++cas,ans);
83     }
84 
85     return 0;
86 }

 

posted @ 2017-09-25 17:07  qrfkickit  阅读(139)  评论(0编辑  收藏  举报