zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    腾讯云学习笔记
    STL常见容器的理解
    C++STL
    Ubuntu:查看目录或文件信息 ls
    安装Ubuntu(通过U盘启动盘)
    C++基础知识
    C++ OpenCV常用的一些函数
    sqlite3主键,外键
    Windows下 Qt添加新模块
    IDE将C++源码生成为可执行文件过程
  • 原文地址:https://www.cnblogs.com/zhurb/p/5836868.html
Copyright © 2011-2022 走看看