• poj1681 Painter's Problem<高斯消元>


    链接http://poj.org/problem?id=1681

    View Code
     1 #include <stdio.h> 
     2 #include <string.h>
     3 #include <algorithm>
     4 #include <cmath>
     5 using namespace std;
     6 int d[230][230], N, M;
     7 char s[16][16]; 
     8 void solve( int n)
     9 {
    10     int x[230],m[20], t, ans=1000, temp;
    11     t=M-n;
    12     for( int i=1; i<=pow( 2, t ); ++i ){
    13         memset( x, 0, sizeof x  );
    14         for(int j=0; j<t; ++j){
    15             m[j]=(i&(1<<j));
    16             if(m[j]){
    17                 x[n+j]=1;
    18             }    
    19         }
    20         temp=0;
    21         for( int p=n+1;p>=1;--p ){
    22             for(int k=i+1;k<=M;++k){
    23                     x[p]^=( x[k]&&d[p][k] );
    24                 
    25             }
    26             x[p]^=d[p][M+1];
    27             if( x[p])
    28                 temp++;
    29         } 
    30         ans=min( ans, temp );
    31     }
    32     printf( "%d\n", ans );
    33 }
    34 void Gauss(  )
    35 {
    36     int i=1, j, k , p, t;
    37     for(j=1; j<=M; ++j){
    38         for(p=i; p<=M; ++p){
    39             if(d[p][j])break;
    40         }
    41         if( p>M )continue;
    42         if(p!=i){
    43             for(k=j;k<=M+1; ++k){
    44                 t=d[p][k],d[p][k]=d[i][k],d[i][k]=t;
    45             }    
    46         }
    47         for(p=i+1; p<=M; ++p){
    48             if( d[p][j] ){
    49                 for( k=j; k<=M+1; ++k ){
    50                     d[p][k]^=d[i][k];
    51                 }
    52             }
    53         }
    54         ++i;
    55     }
    56     for( p=i; p<=M; ++p ){
    57         if( d[p][M+1] ){
    58             puts("inf");
    59             return;
    60         }
    61     }    
    62     solve( i-1 );
    63 }
    64 int main( )
    65 {
    66     int T; 
    67     scanf("%d", &T );
    68     while( T --) {
    69         scanf( "%d", &N );
    70         M=N*N;
    71         for( int i=0; i<N; ++ i ){
    72             scanf( "%s", s[i] ); 
    73         } 
    74         memset( d, 0, sizeof d );
    75         for( int i=1; i<=M; ++ i )
    76             d[i][i]=1;
    77         for( int i=0; i<N; ++i ){
    78             for( int j=0;j<N; ++j ){
    79                 if( s[i][j]=='w' ) d[i*N+j+1][M+1]=1;
    80                 
    81                 if( i>0 )d[(i-1)*N+j+1][i*N+j+1]=1;
    82                 if( j>0 )d[i*N+j][i*N+j+1]=1;
    83                 if( i<N-1 )d[(i+1)*N+j+1][i*N+j+1]=1;
    84                 if( j<N-1 )d[i*N+j+2][i*N+j+1]=1;        
    85             } 
    86         }
    87         Gauss( ); /*
    88         for( int i=1; i<=M; ++i ){
    89             for(int j=1;j<=M; ++ j ){
    90                 printf( "%d ", d[i][j] );
    91             }
    92             puts( "" );
    93         }*/
    94     } 
    95     return 0;    
    96 } 
  • 相关阅读:
    解决png图像透明问题
    常用的CSS命名规则
    站点跨域登录
    SVN服务器配置
    开源方便的PHP & Flash图表:Open Flash Chart
    php+mysql无限级分类(非递归)
    地址栏显示图标 Shortcut Icon
    mysql set类型和enum类型
    通过 WebDAV 协议访问版本库(http://)
    年薪第一的数据库工程师是怎样炼成的
  • 原文地址:https://www.cnblogs.com/jian1573/p/2612890.html
Copyright © 2020-2023  润新知