Time Limit: 1000MS | Memory Limit: 10000K | |
Description
Input
Output
Sample Input
2 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 1 0 0 0 1 0 1 0 0
Sample Output
PUZZLE #1 1 0 1 0 0 1 1 1 0 1 0 1 0 0 1 0 1 1 1 0 0 1 0 0 0 1 0 0 0 0 PUZZLE #2 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1
分析:30点作为未知数,30个点可以列出30个方程组,高斯消元解出答案;
代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <algorithm> #include <climits> #include <cstring> #include <string> #include <set> #include <bitset> #include <map> #include <queue> #include <stack> #include <vector> #include <cassert> #include <ctime> #define rep(i,m,n) for(i=m;i<=(int)n;i++) #define mod 1000000007 #define inf 0x3f3f3f3f #define vi vector<int> #define pb push_back #define mp make_pair #define fi first #define se second #define ll long long #define pi acos(-1.0) #define pii pair<int,int> #define sys system("pause") #define ls rt<<1 #define rs rt<<1|1 #define all(x) x.begin(),x.end() const int maxn=1e2+10; const int N=5e2+10; using namespace std; ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);} ll qmul(ll p,ll q,ll mo){ll f=0;while(q){if(q&1)f=(f+p)%mo;p=(p+p)%mo;q>>=1;}return f;} ll qpow(ll p,ll q,ll mo){ll f=1;while(q){if(q&1)f=qmul(f,p,mo)%mo;p=qmul(p,p,mo)%mo;q>>=1;}return f;} int n,m,k,t,cas; int lcm(int x,int y){return x/__gcd(x,y)*y;} int a[maxn][maxn]; int x[maxn]; bool free_x[maxn]; int free_num; int Gauss(int equ,int var) { int i, j, k; int max_r; int col; int ta, tb; int LCM; int temp; int free_x_num; int free_index; for (col=0,k = 0; k < equ && col < var; k++, col++) { max_r = k; for (i = k + 1; i < equ; i++) { if (abs(a[i][col]) > abs(a[max_r][col])) max_r = i; } if (max_r != k) { for (j = k; j < var + 1; j++) swap(a[k][j], a[max_r][j]); } if (a[k][col] == 0) { k--; continue; } for (i = k + 1; i < equ; i++) { if (a[i][col] != 0) { for (j = col; j < var + 1; j++) { a[i][j] ^= a[k][j]; } } } } for (i = var - 1; i >= 0; i--) { temp = a[i][var]; for (j = i + 1; j < var; j++) { if (a[i][j] != 0) temp ^= x[j]; } x[i] = temp ; } return 0; } void init() { for(int i=0;i<=4;i++) { for(int j=0;j<=5;j++) { for(int k=0;k<=4;k++) { for(int w=0;w<=5;w++) { a[i*6+j][k*6+w]=(abs(i-k)+abs(j-w)<=1); } } } } } int main() { int i,j; scanf("%d",&t); while(t--) { rep(i,0,4)rep(j,0,5)scanf("%d",&a[i*6+j][30]); init(); printf("PUZZLE #%d\n",++cas); Gauss(30,30); rep(i,0,4) { rep(j,0,5) { printf("%d%c",x[i*6+j],j==5?‘\n‘:‘ ‘); } } } return 0; }
原文:http://www.cnblogs.com/dyzll/p/7226526.html