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

posted @ 2012-08-05 21:53  pushing my way  阅读(203)  评论(0编辑  收藏  举报