poj 1681(高斯消元。。。)

再次认真学习高斯消元。。。。感觉还有好多不会处理的。。。自由基的处理还没遇到(discuss里说不用处理也能过的。。。就没处理。。参照了别人的模板。。。自己写的很撮)。。。。收获很多。。。继续ing。。。。


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map1[230][230], ans, n, m;
int dir[4][2] = {0,1,0,-1,1,0,-1,0};

int gauss() {
    int i,j,k,t;
    for(i=0,j=0; i<n && j<n; i++,j++) {
        k=i;
        while(!map1[k][j] && k<n)
            k++;
        if(k==n){
            i--;continue;
        }
        if(k!=i)
            for(t = j; t <= n; t++)
                swap(map1[i][t],map1[k][t]);
        for(k=i+1; k < n; k++)
            if(map1[k][j])
                for(t=j;t<=n;t++)
                    map1[k][t]^=map1[i][t];
    }
    k=i;
    for(i=k;i<n;i++)
        if(map1[i][n])
            return -1;
    for(i=k-1,t=0; i >= 0; i--){
        for(j=i+1;j<n;j++)
            map1[i][n]^=(map1[i][j]&&map1[j][n]);
        if(map1[i][n]) t++;
    }
    return t;
}

int main() {
    int cas, i, j, ans;
    char c;
    scanf("%d", &cas);
    while (cas--) {
        scanf("%d", &m);
        memset(map1, 0, sizeof (map1));
        n = m*m;
        for (i = 0; getchar(), i < m; i++)
            for (j = 0; j < m; j++) {
                c = getchar();
                if (c == 'w')
                    map1[i * m+j][n] = 1;
                else
                    map1[i * m+j][n] = 0;
            }
        for (i = 0; i < m; i++)
            for (j = 0; j < m; j++) {
                map1[i*m+j][i*m+j]=1;
                for(int k=0;k<4;k++){
                    int dx=i+dir[k][0],dy=j+dir[k][1];
                    if(dx>=0 && dx<m && dy>=0 && dy<m)
                        map1[dx*m+dy][i*m+j]=1;
                }
            }
        ans=gauss();
        if(ans==-1)
            printf("inf\n");
        else
            printf("%d\n",ans);
    }
    return 0;
}


你可能感兴趣的:(c)