POJ2965

4 篇文章 0 订阅

看了实在佩服

[cpp]  view plain copy
  1. /*既然说要把所有的开关变成是打开的话,那么怎么样才能做而且又不影响其他的布局呢?如果没遇到一个‘+’即关闭的开关,我们就把这个开关所在行和列包括它本身(本身只操作一次)都操作一次的话。那么可以计算它本身的状态变化次数为7,其同在一行和一列的元素则状态变化为4,余下的状态转化都是2.可以得到这个方法可以在不影响其它元素的状态下将关闭的开关打开(因为偶数次对状态实际上是没有影响的)。所有我们只要遇到一个'+'就重复上面的操作,而且用一个数组记录下每个元素被操作的次数。最后扫描一次数组,操作次数为奇数的就是我们需要操作的点(偶数次操作相当于没有操作)。 
  2. 代码:*/  
  3. #include<stdio.h>  
  4. long m[5][5] ;  
  5. void dose(int x,int y){//没操作一次就对元素标记数组加一  
  6. for(int i = 1;i<=4;i++){  
  7. m[x][i]++ ;  
  8. if(i!=x)m[i][y]++ ;  
  9. }  
  10. }  
  11. int steps(){//计算需要操作的次数  
  12. int c = 0 ;  
  13. for(int i=1;i<=4;i++)  
  14. for(int j=1;j<=4;j++)  
  15. if(m[i][j]%2) c++ ;  
  16. return c ;  
  17. }  
  18. int main()  
  19. {  
  20. int  
  21. char c ;  
  22. for(i = 1 ; i <= 4 ; i++){  
  23. for(j = 1 ; j <= 4 ; j++){  
  24. scanf("%c",&c) ;  
  25. if(c=='+') dose(i,j) ;  
  26. }  
  27. getchar() ;  
  28. }  
  29. printf("%d\n",steps()) ;  
  30. for(int i=1;i<=4;i++)  
  31. for(int j=1;j<=4;j++)  
  32. if(m[i][j]%2)//遇到是奇数的就打印出来  
  33. printf("%d %d\n",i,j) ;  
  34. return 0 ;  
  35. }  

 

当然还有一种纯纯的暴力枚举也能过。。用16个for语句的枚举。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值