Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 8364 | Accepted: 5406 |
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 题意:给你一个5*6的图,然后每一块上有一个灯,当你点击一个点的开关,它的周围四个方向的开关也会变化,可以 点击多个开关,问应该点击哪几个 思路:高斯消元的模板,其实就是线性代数中普通矩阵转化为阶梯型矩阵的过程,相当于一个方程组,一般是5个变元 ,5个方程,然后根据它的增广矩阵来求此方程组是否有解,困难的地方在于方程组的建立,即初始矩阵的建立,这个 题目就想当于x(1,1)*a1+x(1,2)*a2+....+x(5,6)*a30=0这样一个方程组,其中有30个方程式,建立增广矩阵求解,其 实我对高斯消元理解的也不是很透彻,还需要多多努力。。。 ac代码:#include<stdio.h> #include<math.h> #include<string.h> #include<stack> #include<set> #include<queue> #include<vector> #include<iostream> #include<algorithm> #define MAXN 1010 #define LL long long #define ll __int64 #define INF 0xfffffff #define mem(x) memset(x,0,sizeof(x)) #define PI acos(-1) using namespace std; int gcd(int a,int b){return b?gcd(b,a%b):a;} LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;} //head int a[MAXN][MAXN]; int equ,var; int x[MAXN]; int free_x[MAXN]; int free_num; void debug() { int i,j; printf("debug\n"); for(i=0;i<equ;i++) { for(j=0;j<var;j++) printf("%d ",a[i][j]); printf("\n"); } } int Gauss() { int i,j,col,k,max_r; free_num=0; for(k=0,col=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(a[max_r][col]==0) { k--; free_x[free_num++]=col; continue; } if(max_r!=k) { for(j=col;j<var+1;j++) swap(a[k][j],a[max_r][j]); } for(i=k+1;i<equ;i++) { if(a[i][col]) { int lcm=a[k][col]/gcd(a[k][col],a[i][col])*a[i][col]; int ta=lcm/a[i][col],tb=lcm/a[k][col]; if(a[i][col]*a[k][col]<0) tb=-tb; for(int j=col;j<var+1;j++) a[i][j]=((a[i][j]*ta)%2-(a[k][j]*tb)%2+2)%2; } } } for(i=k;i<equ;i++) if(a[i][col]) return -1; if(k<var) return var-k; for(i=var-1;i>=0;i--) { int temp=a[i][var]%2; for(j=i+1;j<var;j++) if(a[i][j]) temp=(temp-a[i][j]*x[j]%2+2)%2; x[i]=(temp/a[i][i]%2); } return 0; } void init() { int i,j; mem(a);mem(x);mem(free_x); equ=30;var=30; for(i=0;i<5;i++) { for(j=0;j<6;j++) { if(i) a[i*6+j][(i-1)*6+j]=1; if(i!=4) a[i*6+j][(i+1)*6+j]=1; if(j) a[i*6+j][i*6+j-1]=1; if(j!=5) a[i*6+j][i*6+j+1]=1; a[i*6+j][i*6+j]=1; } } for(i=0;i<30;i++) scanf("%d",&a[i][30]); } int main() { int t,i,j; int cas=0; scanf("%d",&t); while(t--) { init(); Gauss(); printf("PUZZLE #%d\n",++cas); for(i=0;i<5;i++) { printf("%d",x[i*6]); for(j=1;j<6;j++) printf(" %d",x[i*6+j]); printf("\n"); } } return 0; }