POJ_1222_高斯消元

题目描述:

  每组数据给出一个5*6的0 1矩阵,每次操作可以把某个位置及其四周的位置0 1置换,要求输出操作位置的矩阵。

思路:

  每个位置操作2次则等于没有操作,所以每个位置有操作和不操作两种选择,爆搜应该会超时。

  在网上看到了高斯消元的做法,按照每个操作位置影响的位置构造系数矩阵,然后读入题目的数据构成增广矩阵。

  接下来的做法便和高斯消元一样,只是把原来的-变成了^。

  30条方程,30个未知量,所以最终的解也是唯一。

#include<cstdio>
#include<iostream>
using namespace std;

int a[31][31] = {0};

int main()
{
    int n;
    cin >> n;
    for(int x = 1;x <= n;x++)
    {
        for(int i = 0;i < 30;i++)
        {
            a[i][i] = 1;
            if(i > 5)   a[i][i-6] = 1;
            if(i < 24)  a[i][i+6] = 1;
            if(i%6)     a[i][i-1] = 1;
            if((i+1)%6) a[i][i+1] = 1;
        }
        for(int i = 0;i < 30;i++)   cin >> a[i][30];
        for(int i = 0;i < 30;i++)
        {
            int temp = i;
            for(;temp < 30;temp++)
            {
                if(a[temp][i])
                {
                    for(int j = 0;j <= 30;j++)  swap(a[temp][j],a[i][j]);
                    break;
                }
            }
            for(int j = 0;j < 30;j++)
            {
                if(j != i && a[j][i])
                {
                    for(int k = i;k <= 30;k++)
                    {
                        a[j][k] ^= a[i][k];
                    }
                }
            }
        }
        cout << "PUZZLE #" << x << endl;
        for(int i = 0;i < 30;i++)
        {
            if((i+1)%6) cout << a[i][30] << " ";
            else        cout << a[i][30] << endl;
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zhurb/p/5836868.html