hiho 57 高斯消元 二

問題

http://hihocoder.com/problemset/problem/1196?sid=785572

解法

轉換成異或表達式, 然後使用高斯消元的到解。

#include <bits/stdc++.h>
using namespace std;
enum{maxn = 30, n=5, m=6};
int a[maxn][maxn];
int b[maxn];
int delt[5][2] ={{-1, 0}, {0, -1}, {0, 0}, {0, 1}, {1, 0}}; 
void init()
{
    memset(a, 0, sizeof(a));
    for (int k=0; k<maxn; ++k)
    {
        int i= k/m;
        int j= k%m;
        for (int c = 0; c<5; ++c)
        {
            int ii = i+delt[c][0];
            int jj= j+delt[c][1];
            if (0<=ii&& ii<n && 0<=jj&& jj<m)
            {
                int v = ii*m+jj;
                a[v][k] = 1;
            }
        }
    }
}
void swapRow(int i, int j)
{
    if (i==j)
        return;
    for(int k=0; k<maxn; ++k)
        swap(a[i][k], a[j][k]);
    swap(b[i], b[j]);
}
void goss()
{
    for(int i=0; i<maxn; ++i)
    {
        for (int j=i; j<maxn; ++j)
        {
            if (a[j][i])
            {
                swapRow(i, j);
                break;
            }
        }
        for (int j=i+1; j<maxn; ++j)
        {
            if (!a[j][i])
                continue;
            for (int k=i; k<maxn; ++k)
                a[j][k] ^= a[i][k];
            b[j] ^= b[i];
        }
    }

    int num =0;
    for (int i=maxn-1; i>=0; --i)
    {
        for (int j=i+1; j< maxn; ++j)
        {
            b[i] ^= (a[i][j] * b[j]);
        }
        if (b[i])
            ++num;
    }

    printf("%d\n", num);
    for (int i=0; i<maxn; ++i)
    {
        if (b[i])
        {
            int ii = i/m;
            int jj= i%m;
            printf("%d %d\n", ii+1, jj+1);
        }
    }
}
int main()
{
    char s[10];
    for (int i=0; i<n; ++i)
    {
        scanf("%s", s);
        for(int j=0; j<m; ++j)
            b[i*m+j] = (s[j]-'0') ^1;
    }
    init();
    goss();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章