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