poj2965_flip

题意:有一个4*4的+,-矩阵,矩阵中'+'代表门是开着的,'-'代表门是关着的。每一次翻转操作是将对应位置的x和y轴的所有门都进行翻转。求将所给出的状态变成门都开着的状态所需要翻转的门的个数。
分析:
1.'+'对应位置的行与列各个单位都进行一次翻转操作,那么整个图中只有这个'+'的位置符号改变了。
2.因此只要对初始状态中的每一个'+'都进行一次操作,整个图中对应翻转的位置由0开始累加。最后取余2,得到为1的位置就是需要翻转的位置。
3.整个图中需要翻转的最大次数是16次。
代码:

View Code
 1 #include <iostream>

 2 #include <stdio.h>

 3 #include <memory.h>

 4 using namespace std;

 5 

 6 const int maxnum=5;

 7 int array[maxnum][maxnum];

 8 struct pos

 9 {

10     int x,y;

11 }pos[maxnum*maxnum];

12 int cnt;

13 

14 void function(struct pos a)

15 {

16     int i;

17     for(i=1;i<=4;i++)

18         array[i][a.y]++;

19     for(i=1;i<=4;i++)

20         array[a.x][i]++;

21     array[a.x][a.y]--;

22 }

23 

24 int main()

25 {

26     cnt=1;

27     memset(array,0,sizeof(array));

28     int i,j,sum;

29     char ch;

30     for(i=1;i<=4;i++)

31     {

32         for(j=1;j<=4;j++)

33         {

34             scanf("%c",&ch);

35             if(ch=='+')

36             {

37                 pos[cnt].x=i;

38                 pos[cnt].y=j;

39                 cnt++;

40             }

41         }

42         getchar();

43     }

44 

45     for(i=1;i<cnt;i++)

46         function(pos[i]);

47     sum=0;

48     for(i=1;i<=4;i++)

49         for(j=1;j<=4;j++)

50         {

51             array[i][j]=array[i][j]%2;

52             if(array[i][j]==1)

53                 sum++;

54         }

55     printf("%d\n",sum);

56     for(i=1;i<=4;i++)

57         for(j=1;j<=4;j++)

58             if(array[i][j]==1)

59                 printf("%d %d\n",i,j);

60     return 0;

61 }

tju oj2593

你可能感兴趣的:(poj)