POJ2965The Pilots Brothers' refrigerator

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

这个题的话,一开始也不会做,旁边的人说用BFS,后来去网上看了众大神的思路,瞬间觉得用BFS挺简单易;因为要让一个“+”变为“-”,只要将加号所在的位置(i,j)的行和列上的7个元素全部改变一次,这样的话(i,j)这个点将会变化7次,而 i 行上和 j 列另外六个元素将会变化4次,剩下的那些会变化2次,显而易见的是,一个位置上若翻转偶数次相当于没翻转,所以,只要记录下奇数次的翻转进行相加就可以了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cstdlib>
 5 using namespace std ;
 6 char  ans[6][6];
 7 int flag[6][6];
 8 int main()
 9 {
10     memset(flag,0,sizeof(flag));
11     for(int i = 0 ; i <= 3 ; i++)
12     {
13         scanf("%s",ans[i]);//这个题输入的时候我用的两个for循环输入数组里,但是错了。。
14     }
15     for(int i = 0 ; i <= 3 ; i++)
16     {
17         for(int j = 0 ; j <= 3 ; j++)
18         {
19             //scanf("%c",&ans) ;
20             if(ans[i][j] == '+')
21             {
22                 for(int k = 0 ; k <= 3 ; k++)
23                 {
24                     //加号所在的位置行列的翻转次数全加一。
25                     flag[i][k]++ ;
26                     flag[k][j]++ ;
27                 }
28                 flag[i][j]-- ;//上边两次多加了一次这个,所以在这里减1 ;
29             }
30         }
31     }
32     int sum = 0 ;
33     for(int i = 0 ; i <= 3 ; i++)
34     {
35         for(int j = 0 ; j <= 3 ; j++)
36         {
37             sum += flag[i][j]%2 ;//遍历整个数组,凡是为奇数次的位置之和即为总的操作次数
38         }
39     }
40     printf("%d
",sum) ;
41     for(int i = 0 ; i <= 3 ; i++)
42     {
43         for(int j = 0 ; j <= 3 ; j++)
44         {
45             if(flag[i][j]%2 == 1)
46             {
47                 cout<<i+1<<' '<<j+1<<endl ;
48             }
49         }
50     }
51     return 0 ;
52 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3234636.html