Gym 100008E Harmonious Matrices 高斯消元

POJ 1222 高斯消元更稳

看这个就懂了

#include <bits/stdc++.h>
using namespace std;

const int maxn = 2000;
int a[maxn][maxn];
int x[maxn];
int dx[]= {0,0,-1,0,1};
int dy[]= {0,-1,0,1,0};

void Guass(int equ,int var)
{
    int row,col;
    row=col=0;
    while(row<equ && col<var)
    {
        //列非零主
        int r=row;
        for(int i=row; i<equ; i++)
            if(a[i][col]!=0)
            {
                r=i;
                break;
            }
        if(r!=row)
        {
            for(int j=col; j<var+1; j++)
                swap(a[row][j],a[r][j]);
        }
        if(a[row][col]==0)//说明有自由变元
        {
            col++;
            continue;
        }
        //消元
        for(int i=row+1; i<equ; i++)
        {
            if(a[i][col]==0) continue;
            for(int j=col; j<var+1; j++)
                a[i][j]^=a[row][j];
        }
        row++;
        col++;
    }
    int num = col-row;
    for(int i=var-1; num!=0; i--,num--)
        x[i] = 1;
    num = col-row;
    for(int i=equ-num-1; i>=0; i--)
    {
        x[i]=a[i][var];
        for(int j=i+1; j<var; j++)
            x[i]^=(a[i][j]*x[j]);
    }
}

int main()
{
//    freopen("in.txt","r",stdin);
    int t,n,m;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d", &n, &m);
        memset(a,0,sizeof(a));
        for(int i=0; i<n; i++)
            for(int j=0; j<m; j++)
                for(int k=0; k < 5; k++)
                {
                    int nx = i+dx[k];
                    int ny = j+dy[k];
                    if(nx >= 0 && nx < n && ny >= 0 && ny < m) a[i*m+j][nx*m+ny] = 1;
                }
        Guass(n*m, n*m);
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<m-1; j++)
                printf("%d ", x[i*m+j]);
            printf("%d
", x[i*m+m-1]);
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/pach/p/7300197.html