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\n",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

 

你可能感兴趣的:(poj)