标签:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7459 | Accepted: 4860 |
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
Source
/** 题意:给一个5*6的0,1矩阵,0表示开关关闭,1表示开关打开;然后问改变一个开关 , 它和它的上下左右都会变,然后问按哪些开关可以使得所有的灯关闭 做法:高斯消元 建立一个30*30的矩阵表示按当前按钮,会发生变化的灯。 **/ #include <iostream> #include <string.h> #include <cmath> #include <algorithm> #include <stdio.h> #define maxn 40 using namespace std; int mmap[maxn][maxn]; int x[maxn]; int gcd(int a,int b) { if(b == 0) return a; return gcd(b,a%b); } int Lcm(int a,int b) { return a/gcd(a,b) * b; } int Guess(int equ,int val) { int lcm; int ta; int tb; int max_r; int k; int col; col = 0; ///上三角行列式 for(k = 0; k<equ&&col < val; k++,col++) { max_r = k; for(int i=k+1; i<equ; i++) { if(abs(mmap[i][col]) > abs(mmap[max_r][col])) { max_r = i; } } if(mmap[max_r][col] == 0) { k--; continue; } if(max_r != k) { for(int i=col; i<val+1; i++) { swap(mmap[max_r][i],mmap[k][i]); } } for(int i=k+1; i<equ; i++) { if(mmap[i][col] != 0) { for(int j=col; j<val+1; j++) { mmap[i][j] ^= mmap[k][j]; } } } } for(int i=k; i<equ; i++) { if(mmap[i][col] != 0) return -1; } if(val > k) return val - k; ///回代 for(int i=val-1; i>=0; i--) { x[i] = mmap[i][val]; for(int j=i+1; j<val; j++) { x[i] ^= (mmap[i][j] & x[j]); } } return 0; } void init() { memset(mmap,0,sizeof(mmap)); memset(x,0,sizeof(x)); for(int i=0; i<5; i++) { for(int j=0; j<6; j++) { int tt = (i*6) + j; mmap[tt][tt] = 1; if(i > 0) mmap[(i-1)*6 + j][tt] = 1; if(i < 4) mmap[(i+1)*6+ j][tt] = 1; if(j > 0) mmap[i*6 + j-1][tt] = 1; if(j < 5)mmap[i*6+j + 1][tt] = 1; } } } int main() { // freopen("in.txt","r",stdin); int T; int Case = 1; scanf("%d",&T); while(T--) { init(); for(int i=0; i<30; i++) { scanf("%d",&mmap[i][30]); } Guess(30,30); printf("PUZZLE #%d\n",Case++); for(int i=0; i<5; i++) { for(int j=0; j<6; j++) { printf("%d",x[i*6+j]); if(j != 5) printf(" "); } printf("\n"); } // printf("\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4521547.html