首页 > 代码库 > POJ_1222_高斯消元

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;}

 

POJ_1222_高斯消元