标签:
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