标签:
Description

Input
Output
Sample Input
2 3 yyy yyy yyy 5 wwwww wwwww wwwww wwwww wwwww
Sample Output
0 15
题目和http://blog.csdn.net/winddreams/article/details/43152305黑白棋完全一样,只是加了n的大小和多组
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std ;
#define INF 0x3f3f3f3f
int Map[400][400] , a[400] , freex[400] , x[400] ;
char str[20][20] ;
void init(int n)
{
int i , j , k ;
memset(Map,0,sizeof(Map)) ;
for(i = 0 ; i < n ; i++)
{
for(j = 0 ; j < n ; j++)
{
a[i*n+j] = str[i][j] - '0' ;
Map[i*n+j][i*n+j] = 1 ;
if( i > 0 ) Map[i*n+j][i*n+j-n] = 1 ;
if( i < n-1 ) Map[i*n+j][i*n+j+n] = 1 ;
if( j > 0 ) Map[i*n+j][i*n+j-1] = 1 ;
if( j < n-1 ) Map[i*n+j][i*n+j+1] = 1 ;
}
}
return ;
}
void swap1(int p,int q,int n)
{
int i , temp ;
temp = a[p] ;
a[p] = a[q] ;
a[q] = temp ;
for(i = 0 ; i < n ; i++)
{
temp = Map[p][i] ;
Map[p][i] = Map[q][i] ;
Map[q][i] = temp ;
}
return ;
}
int solve(int n)
{
int i , j , k , t = 0 , num1 = 0 ;
for(i = 0 ; i < n && t < n ; i++ , t++)
{
for(j = i ; j < n ; j++)
if( Map[j][t] ) break ;
if( j == n )
{
i-- ;
freex[num1++] = t ;
continue ;
}
if( i != j )
swap1(i,j,n) ;
for(j = i+1 ; j < n ; j++)
{
if( Map[j][t] )
{
a[j] ^= a[i] ;
for(k = t ; k < n ; k++)
Map[j][k] ^= Map[i][k] ;
}
}
}
for( ; i < n ; i++)
if( a[i] ) return -1 ;
if( num1 > 0 ) return num1 ;
for(i = n-1 ; i >= 0 ; i--)
{
x[i] = a[i] ;
for(j = i+1 ; j < n ; j++)
x[i] ^= (Map[i][j]*x[j]) ;
}
return num1 ;
}
int main()
{
int t , n , i , j , k , min1 , ans , key ;
scanf("%d", &t) ;
while( t-- )
{
scanf("%d", &n) ;
for(i = 0 ; i < n ; i++)
{
scanf("%s", str[i]) ;
for(j = 0 ; j < n ; j++)
{
if( str[i][j] == 'w' )
str[i][j] = '1' ;
else
str[i][j] = '0' ;
}
}
init(n) ;
key = solve(n*n) ;
min1 = INF ;
if( key == 0 )
{
ans = 0 ;
for(i = 0 ; i < n*n ; i++)
ans += x[i] ;
min1 = min( min1 , ans ) ;
}
else if( key > 0 )
{
int t , temp = 1<<key ;
for(t = 0 ; t < temp ; t++)
{
ans = 0 ;
memset(x,0,sizeof(x)) ;
for(j = 0 ; j < key ; j++)
if( t & (1<<j) )
{
x[ freex[j] ] = 1 ;
ans++ ;
}
for(i = n*n-1 ; i >= 0 ; i--)
{
for(k = 0 ; k < n*n ; k++)
if( Map[i][k] )
break ;
x[k] = a[i] ;
for(j = k+1 ; j < n*n ; j++)
x[k] ^= ( Map[i][j]*x[j] ) ;
ans += x[k] ;
}
min1 = min( ans , min1 ) ;
}
}
if( min1 == INF )
printf("inf\n") ;
else
printf("%d\n", min1) ;
}
return 0;
}
poj1681--Painter's Problem(高斯消元问题4)
标签:
原文地址:http://blog.csdn.net/winddreams/article/details/43153621