poj 2965 The Pilots Brothers' refrigerator

题目描述:

  有一个4*4的矩阵,求最少次的操作,把这16个格子都变成‘-’,每次翻转(i,j)的时候,第i行,第j列也会变为相反的状态。

解题思路:

  话说条条大路通罗马,这个题目也有很多种方法,1:bfs+状态压缩,2:状态压缩+枚举,3:高斯消元。这些方法都可以,我在这里就说一下我的方法。

  根据每次操作的变化可以知道,对于一个矩阵,如果只有(i,j)是‘+’状态,我们把第i行,第j列的格子都操作一次全部都会变为合法状态(‘-’的,成为合法状态),我们现在对所有的不合法状态都进行此操作,我们会发现有一些格子我们操作了两次或者是偶数次,因为每个格子只有两种状态,为了使操作有意义,我们对每个格子最多操作一次,最后我们只需要统计操作奇数次的格子并输出其对应的下标即可。

题目链接:

  http://poj.org/problem?id=2965

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 
 5 #define N 5
 6 
 7 char map[N];
 8 int vis[N][N];
 9 void change (int x, int y);
10 void add ();
11 
12 int main ()
13 {
14     int i, j, sum, n;
15     memset (vis, 0, sizeof(vis));
16 
17     for (i=0; i<4; i++)
18     {
19         scanf ("%s", map);
20         for (j=0; j<4; j++)
21             if (map[j] == '+')
22                 change (i, j);
23     }
24 
25     add ();
26     return 0;
27 }
28 
29 void change (int x, int y)
30 {
31     for (int i=0; i<4; i++)
32        vis[x][i]++, vis[i][y]++;
33 
34         vis[x][y] --;
35 }
36 void add ()
37 {
38     int i, j, num = 0;
39 
40     for (i=0; i<4; i++)
41         for (j=0; j<4; j++)
42             if (vis[i][j] % 2)
43                 num ++;
44     printf ("%d\n", num);
45     for (i=0; i<4; i++)
46         for (j=0; j<4; j++)
47         if (vis[i][j] % 2)
48         printf ("%d %d\n", i+1, j+1);
49 }
View Code

 

posted @ 2014-12-15 09:48  罗茜  阅读(190)  评论(0编辑  收藏  举报