设为首页 加入收藏

TOP

poj1222--EXTENDED LIGHTS OUT(高斯消元)
2015-11-21 00:56:07 来源: 作者: 【 】 浏览:1
Tags:poj1222--EXTENDED LIGHTS OUT 高斯

?

题目大意:给出5*6的矩阵,每个格子都是一个开关(开是1,关是0),每改变一个格子,格子自身和上下左右都会改变,问最终都要变成关,需要怎么操作。

每个格子只能被操作0次,或1次,多了是没有意义的,所以按照每一个格子可以影响的位置列出方程组。高斯消元

?

?

#include 
  
   
#include 
   
     #include 
    
      using namespace std ; int s[5][2] = { {0,0},{0,1},{0,-1},{1,0},{-1,0} } ; int Map[30][30] , a[30] , ans[30] ; void solve() { int i , j , k , l ; for(i = 0 , k = 0 ; i < 30 && k < 30 ; i++ , k++) { for(j = i ; j < 30 ; j++) if( Map[j][k] ) break ; if( j >= 30 ) { i-- ; continue ; } if( i != j ) { for(l = k ; l < 30 ; l++) swap(Map[i][l],Map[j][l]) ; swap(a[i],a[j]) ; } for(j = i+1 ; j < 30 ; j++) { if( !Map[j][k] ) continue ; for(l = k ; l < 30 ; l++) Map[j][l] = Map[i][l]^Map[j][l] ; a[j] = a[i]^a[j] ; } } for(i = 29 ; i >= 0 ; i--) { for(j = i+1 ; j < 30 ; j++) a[i] = a[i]^(ans[j]*Map[i][j]) ; ans[i] = a[i] ; } memset(Map,0,sizeof(Map)) ; for(i = 0 ; i < 30 ; i++) { if( ans[i] ) { Map[ i/6 ][ i%6 ] = 1 ; } } for(i = 0 ; i < 5 ; i++) { for(j = 0 ; j < 5 ; j++) printf(%d , Map[i][j]) ; printf(%d , Map[i][5]) ; } return ; } int main() { int t , step = 0 ; int i , j , k , x , y ; scanf(%d, &t) ; while( t-- ) { memset(Map,0,sizeof(Map)) ; for(i = 0 ; i < 5 ; i++) { for(j = 0 ; j < 6 ; j++) { for(k = 0 ; k < 5 ; k++) { x = i + s[k][0] ; y = j + s[k][1] ; if( x >= 0 && x < 5 && y >= 0 && y < 6 ) Map[x*6+y][i*6+j] = 1 ; } } } for(i = 0 ; i < 5 ; i++) for(j = 0 ; j < 6 ; j++) scanf(%d, &a[i*6+j]) ; printf(PUZZLE #%d , ++step) ; solve() ; } return 0 ; } 
    
   
  


?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇HDU 2435 There is a war(修改或.. 下一篇C++ 理解函数对象与lambda表达式

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: