您的位置:首页 > 其它

poj1222 EXTENDED LIGHTS OUT<高斯消元>

2012-07-28 16:22 441 查看
链接: http://poj.org/problem?id=1222

View Code

#include <stdio.h>
#include <string.h>
int d[35][35], x[35], map[7][7];
const int N=30;
void Gauss(  )
{
int i=1, j, p, k, t;
for( j=1; j<=N; ++ j ){
for( p=i;p<=N; ++ p ){
if(d[p][j])break ;
}
if( p>N )continue;
if( p!=i ){
for( k=j; k<=N+1; ++k ){
t=d[p][k],d[p][k]=d[i][k],d[i][k]=t;
}
}
for( p=i+1; p<=N; ++p ){
if( d[p][j] ){
for(k=j;k<=N+1; ++k ){
d[p][k]^=d[i][k];
}
}
}
++i;
}
memset( x, 0, sizeof x );
for( p=N; p>=1; --p){
for( k=p+1; k<=N; ++ k ){
x[p]^=( x[k]&&d[p][k] );
}
x[p]^=d[p][N+1];
}
for( int i=1; i<=30; ++i ){
printf( "%d ", x[i]);
if( i%6==0 )
puts("");
}
//puts( "" );
}
int main( )
{
int T,Case=1;
scanf( "%d", &T );
while(T--) {
memset(d, 0, sizeof d);
for( int i=1; i<=30; ++i )
d[i][i]=1;
for( int i=0; i<5; ++ i ){
for(int j=0; j<6;++j ){
scanf( "%d", &map[i][j] );
if( map[i][j] )    d[i*6+j+1][31]=1;

if( i>0 )d[(i-1)*6+j+1][i*6+j+1]=1;
if( j>0 )d[i*6+j][i*6+j+1]=1;
if( i<4 )d[(i+1)*6+j+1][i*6+j+1]=1;
if( j<5 )d[i*6+j+2][i*6+j+1]=1;
}
}
printf( "PUZZLE #%d\n", Case++ );
Gauss( );
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: