高斯消元

异或模版:

int A[mMAX][mMAX],ans[mMAX];
bool Gauss(int r,int c){
for( int k=0; k<r; k++){
int i ;
for(i=k;i<r && A[i][k]==0;i++);
if(i==r)
continue;
if(i > k){
for(int j=0; j<=c; j++)
swap(A[i][j], A[k][j]);
}
for(int i=0; i<r; i++){
if(i != k && A[i][k]){
for(int j=0; j<=c; j++)
A[i][j] ^= A[k][j];
}
}
}
for(int i=0;i<r;i++){
if(!A[i][i]&&A[i][c]) return 0; //表示无解
}
for(int i=0;i<r;i++)
ans[i] = A[i][c];
return 1;
}

 

poj 1222 http://poj.org/problem?id=1222

参照详细解题报告 :http://blog.csdn.net/shiren_Bod/article/details/5766907

View Code
#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
#include <iomanip>
#include <bitset>
using namespace std;
#define LL long long

const int MAX = 1<<2;
const int nMAX =10;
const int mMAX =100;
const int INF =((1<<31)-1);
const int MOD= 1000000007;
int A[mMAX][mMAX],ans[mMAX];
void Gauss(int r,int c){
for( int k=0; k<r; k++){
int i ;
for(i=k;i<c && A[i][k]==0;i++);
if(i > k){
for(int j=0; j<=c; j++)
swap(A[i][j], A[k][j]);
}
for(int i=0; i<r; i++){
if(i != k && A[i][k]){
for(int j=0; j<=c; j++)
A[i][j] ^= A[k][j];
}
}
}
for(int i=0;i<r;i++)
ans[i] = A[i][c];
}
int main(){
int T,CASE=1,r=5,c=6;
scanf("%d",&T);
while (T--){
memset(A,0,sizeof(A));
for(int i=0;i<r*c;i++) scanf("%d",&A[i][r*c]);
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
A[i*c+j][i*c+j]=1;
if(i-1>=0) A[i*c+j][(i-1)*c+j]=1;
if(i+1<r) A[i*c+j][(i+1)*c+j]=1;
if(j-1>=0) A[i*c+j][i*c+j-1]=1;
if(j+1<c) A[i*c+j][i*c+j+1]=1;
}
}
Gauss(30,30);
printf("PUZZLE #%d\n",CASE++);
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
if(j!=c-1) printf("%d ",ans[i*c+j]);
else printf("%d\n",ans[i*c+j]);
}
}
}
}

POJ 1681  http://acm.pku.edu.cn/JudgeOnline/problem?id=1681

View Code
#include<iostream>
#include<cstring>
#include <cstdio>
#include<string>
#include<queue>
#include<vector>
#include<map>
#include <set>
#include<ctime>
#include<cmath>
#include <cstdlib>
#include<algorithm>
#include <iomanip>
#include <bitset>
using namespace std;
#define LL long long

const int MAX = 1<<2;
const int nMAX =10;
const int mMAX =300;
const int INF =((1<<31)-1);
const int MOD= 1000000007;
int A[mMAX][mMAX],ans[mMAX];
bool Gauss(int r,int c){
for( int k=0; k<r; k++){
int i ;
for(i=k;i<r && A[i][k]==0;i++);
if(i==r)
continue;
if(i > k){
for(int j=0; j<=c; j++)
swap(A[i][j], A[k][j]);
}
for(int i=0; i<r; i++){
if(i != k && A[i][k]){
for(int j=0; j<=c; j++)
A[i][j] ^= A[k][j];
}
}
}
for(int i=0;i<r;i++){
if(!A[i][i]&&A[i][c]) return 0;
}
for(int i=0;i<r;i++)
ans[i] = A[i][c];
return 1;
}
int main(){
int T,r,c;
scanf("%d",&T);
while (T--){
int n;
scanf("%d",&n); r=n,c=n;
memset(A,0,sizeof(A));
char s[50];
for(int i=0;i<r;i++){
scanf("%s",s);
for(int j=0;j<c;j++){
if(s[j]=='y') A[i*c+j][n*n]=0;
else A[i*c+j][n*n]=1;
}
}
for(int i=0;i<r;i++){
for(int j=0;j<c;j++){
A[i*c+j][i*c+j]=1;
if(i-1>=0) A[i*c+j][(i-1)*c+j]=1;
if(i+1<r) A[i*c+j][(i+1)*c+j]=1;
if(j-1>=0) A[i*c+j][i*c+j-1]=1;
if(j+1<c) A[i*c+j][i*c+j+1]=1;
}
}
bool sol=Gauss(n*n,n*n);
if(sol==true){
int sum=0;
for(int i=0;i<n*n;i++){
sum+=ans[i];
}
printf("%d\n",sum);
}else printf("inf\n");
}
}



posted @ 2012-04-06 01:00  HaoHua_Lee  阅读(203)  评论(0编辑  收藏  举报