和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 else 102 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 else 113 printf("inf\n"); 114 } 115 return 0; 116 }
POJ 1681
[Gauss]POJ1681 Painter's Problem
时间: 2024-10-23 19:07:56