看了实在佩服
- /*既然说要把所有的开关变成是打开的话,那么怎么样才能做而且又不影响其他的布局呢?如果没遇到一个‘+’即关闭的开关,我们就把这个开关所在行和列包括它本身(本身只操作一次)都操作一次的话。那么可以计算它本身的状态变化次数为7,其同在一行和一列的元素则状态变化为4,余下的状态转化都是2.可以得到这个方法可以在不影响其它元素的状态下将关闭的开关打开(因为偶数次对状态实际上是没有影响的)。所有我们只要遇到一个'+'就重复上面的操作,而且用一个数组记录下每个元素被操作的次数。最后扫描一次数组,操作次数为奇数的就是我们需要操作的点(偶数次操作相当于没有操作)。
- 代码:*/
- #include<stdio.h>
- long m[5][5] ;
- void dose(int x,int y){//没操作一次就对元素标记数组加一
- for(int i = 1;i<=4;i++){
- m[x][i]++ ;
- if(i!=x)m[i][y]++ ;
- }
- }
- int steps(){//计算需要操作的次数
- int c = 0 ;
- for(int i=1;i<=4;i++)
- for(int j=1;j<=4;j++)
- if(m[i][j]%2) c++ ;
- return c ;
- }
- int main()
- {
- int
- char c ;
- for(i = 1 ; i <= 4 ; i++){
- for(j = 1 ; j <= 4 ; j++){
- scanf("%c",&c) ;
- if(c=='+') dose(i,j) ;
- }
- getchar() ;
- }
- printf("%d\n",steps()) ;
- for(int i=1;i<=4;i++)
- for(int j=1;j<=4;j++)
- if(m[i][j]%2)//遇到是奇数的就打印出来
- printf("%d %d\n",i,j) ;
- return 0 ;
- }
当然还有一种纯纯的暴力枚举也能过。。用16个for语句的枚举。。