首页 > 代码库 > [Gauss]POJ1681 Painter's Problem

[Gauss]POJ1681 Painter's Problem

和POJ1222(http://www.cnblogs.com/Empress/p/4156234.html)完全相同

题意也类似, 可以涂自己以及上下左右五个位置的颜色

问几次能全部涂色 不能输出inf

 

  1 #include <cstdio>  2 #include <cstdlib>  3 #include <cstring>  4 #include <climits>  5 #include <cctype>  6 #include <cmath>  7 #include <string>  8 #include <sstream>  9 #include <iostream> 10 #include <algorithm> 11 #include <iomanip> 12 using namespace std; 13 #include <queue> 14 #include <stack> 15 #include <vector> 16 #include <deque> 17 #include <set> 18 #include <map> 19 typedef long long LL; 20 typedef long double LD; 21 const double pi=acos(-1.0); 22 const double eps=1e-9; 23 #define INF 0x3f3f3f 24 #define lson l, m, rt<<1 25 #define rson m+1, r, rt<<1|1 26 typedef pair<int, int> PI; 27 typedef pair<int, PI > PP; 28 #ifdef _WIN32 29 #define LLD "%I64d" 30 #else 31 #define LLD "%lld" 32 #endif 33 //#pragma comment(linker, "/STACK:1024000000,1024000000") 34 //LL quick(LL a, LL b){LL ans=1;while(b){if(b & 1)ans*=a;a=a*a;b>>=1;}return ans;} 35 //inline int read(){char ch=‘ ‘;int ans=0;while(ch<‘0‘ || ch>‘9‘)ch=getchar();while(ch<=‘9‘ && ch>=‘0‘){ans=ans*10+ch-‘0‘;ch=getchar();}return ans;} 36 //inline void print(LL x){printf(LLD, x);puts("");} 37 //inline void read(LL &ret){char c;int sgn;LL bit=0.1;if(c=getchar(),c==EOF) return ;while(c!=‘-‘&&c!=‘.‘&&(c<‘0‘||c>‘9‘)) c=getchar();sgn=(c==‘-‘)?-1:1;ret=(c==‘-‘)?0:(c-‘0‘);while(c=getchar(),c>=‘0‘&&c<=‘9‘) ret=ret*10+(c-‘0‘);if(c==‘ ‘||c==‘\n‘){ ret*=sgn; return ; }while(c=getchar(),c>=‘0‘&&c<=‘9‘) ret+=(c-‘0‘)*bit,bit/=10;ret*=sgn;} 38  39 char mp[20][20]; 40 int a[250][250], x[250]; 41 int n; 42 bool Gauss() 43 { 44     int k, col; 45     for(k=0, col=0;k<n*n && col<n*n;k++, col++) 46     { 47         int maxr=k; 48         for(int i=k+1;i<n*n;i++) 49             if(abs(a[i][col])>abs(a[maxr][col])) 50                 maxr=i; 51         if(k!=maxr) 52             for(int j=col;j<=n*n;j++) 53                 swap(a[k][j], a[maxr][j]); 54         if(a[k][col]==0) 55         { 56             k--; 57             continue; 58         } 59         for(int i=k+1;i<n*n;i++) 60             if(a[i][col]) 61                 for(int j=col;j<=n*n;j++) 62                     a[i][j]^=a[k][j]; 63     } 64     for(int i=k;i<n*n;i++) 65         if(a[i][col]) 66             return false; 67     for(int i=n*n-1;i>=0;i--) 68     { 69         x[i]=a[i][n*n]; 70         for(int j=i+1;j<n*n;j++) 71             x[i]^=(a[i][j] && x[j]); 72     } 73     return true; 74 } 75 int main() 76 { 77     int t; 78     scanf("%d", &t); 79     while(t--) 80     { 81         scanf("%d", &n); 82         for(int i=0;i<n;i++) 83             for(int j=0;j<n;j++) 84                 cin>>mp[i][j]; 85         memset(a, 0, sizeof(a)); 86         for(int i=0;i<n;i++) 87             for(int j=0;j<n;j++) 88             { 89                 int t=i*n+j; 90                 a[t][t]=1; 91                 if(i>0) 92                     a[(i-1)*n+j][t]=1; 93                 if(i<n-1) 94                     a[(i+1)*n+j][t]=1; 95                 if(j>0) 96                     a[i*n+j-1][t]=1; 97                 if(j<n-1) 98                     a[i*n+j+1][t]=1; 99                 if(mp[i][j]==y)100                     a[t][n*n]=0;101                 else102                     a[t][n*n]=1;103             }104         if(Gauss())105         {106             int ans=0;107             for(int i=0;i<n*n;i++)108                 if(x[i]==1)109                     ans++;110            printf("%d\n", ans);111         }112         else113             printf("inf\n");114     }115     return 0;116 }
POJ 1681

 

[Gauss]POJ1681 Painter's Problem