题目地址:POJ 1222
题意:有一个5*6的矩阵,每个位置都表示按钮和灯,1表示亮,0表示灭。每当按下一个位置的按钮,它和它周围灯的状态全部翻转(题目中给出如何影响),问在这样的一个方阵中按下哪些按钮可以把整个方阵都变成灭的,这时1表示按了,0表示没按。
#include <stdio.h> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <sstream> #include <algorithm> #include <set> #include <queue> #include <stack> #include <map> using namespace std; typedef long long LL; const int inf=0x3f3f3f3f; const double pi= acos(-1.0); const double esp=1e-6; const int MAXN=40; int aug[MAXN][MAXN]; int x[MAXN]; int m,n; int dx[]= {0,0,1,0,-1}; int dy[]= {0,1,0,-1,0}; int Gauss() { int i,j; int row,col,max_r; int tmp; for(row=0,col=0; row<m&&col<n; row++,col++) { max_r=row; for(i=row+1; i<m; i++) { if(abs(aug[i][col])>abs(aug[max_r][col])) max_r=i; } if(max_r!=row) { for(j=row; j<n+1; j++) swap(aug[row][j],aug[max_r][j]); } if(aug[row][col]==0) { row--; continue; } for(i=row+1; i<n; i++) { if(aug[i][col]!=0) { for(j=col; j<n+1; j++) aug[i][j]^=aug[row][j]; } } for(i=n-1; i>=0; i--) { x[i]=aug[i][n]; for(j=i+1; j<n; j++) x[i]^=(aug[i][j]&&x[j]); } } return 0; } int main() { int T,i,j,k; int icase=1; scanf("%d",&T); while(T--) { memset(aug,0,sizeof(aug)); memset(x,0,sizeof(x)); n=m=30; for(i=0; i<30; i++) scanf("%d",&aug[i][30]); for(i=0; i<5; i++) for(j=0; j<6; j++) for(k=0; k<5; k++) { int x=i+dx[k]; int y=j+dy[k]; if(x>=0&&x<5&&y>=0&&y<6) { aug[i*6+j][x*6+y]=1; } } Gauss(); printf("PUZZLE #%d",icase++); for(i=0; i<30; i++) { if(i%6!=0) printf(" %d",x[i]); else printf("\n%d",x[i]); } puts(""); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1222-EXTENDED LIGHTS OUT(高斯消元求解异或方程组)
原文地址:http://blog.csdn.net/u013486414/article/details/47028923