zoukankan      html  css  js  c++  java
  • poj1222 EXTENDED LIGHTS OUT(gauss)

    题目翻译
    题目链接

    分析:
    说实话,要是单看这道题,
    是不大可能往解方程的方面想的

    由于只有两个状态
    开是1,关是0
    按开关是1,不按是0
    这样的对应关系符合XOR的特点
    所以我们又可以列出若干异或方程

    由于我们求的是一个矩阵
    每个灯的状态由ta的初始状态以及周围按钮的状态有关
    所以得到的方程就是
    [x,y]^[x-1,y]^[x,y-1]^[x+1,y]^[x,y+1]=当前灯的状态
    高斯消元求解即可

    tip

    在构造初始阵式的时候,坐标是否合法一定要判断准了

    if (i>1) a[bh][get(i-1,j)]=1;
    if (j>1) a[bh][get(i,j-1)]=1;
    if (i<5) a[bh][get(i+1,j)]=1;
    if (j<6) a[bh][get(i,j+1)]=1;

    now++不要忘了

    总结一下有可能出现解方程的题目特点

    • 可以列出方程
    • 一般没有阶段性和次序性(不同于dp或搜索)
    • 由若干个状态确定一个已知状态
    //这里写代码片
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    
    using namespace std;
    
    const int m=30;
    int mp[10][10];
    int a[35][35];
    
    int get(int x,int y){return (x-1)*6+y;}
    
    int gauss()
    {
        int now=1,to;
        for (int i=1;i<=m;i++)
        {
            for (to=now;to<=m;to++)
                if (a[to][i]) break;
            if (to>m) return 0;
            if (to!=now)
                for (int j=1;j<=m+1;j++)
                    swap(a[to][j],a[now][j]);
            for (int j=1;j<=m;j++)
                if (j!=now&&a[j][i])
                    for (int k=1;k<=m+1;k++)
                        a[j][k]^=a[now][k];    
            now++;   
        }
        return 1;
    }
    
    int main()
    {
        int TT;
        scanf("%d",&TT);
        for (int T=1;T<=TT;T++)
        {
            memset(a,0,sizeof(a));
            for (int i=1;i<=5;i++)
                for (int j=1;j<=6;j++)
                    scanf("%d",&mp[i][j]);
            for (int i=1;i<=5;i++)
                for (int j=1;j<=6;j++)
                {
                    int bh=get(i,j);
                    a[bh][m+1]=mp[i][j];
                    if (i>1) a[bh][get(i-1,j)]=1;
                    if (j>1) a[bh][get(i,j-1)]=1;
                    if (i<5) a[bh][get(i+1,j)]=1;
                    if (j<6) a[bh][get(i,j+1)]=1;
                    a[bh][bh]=1;
                }
            gauss();
            printf("PUZZLE #%d
    ",T);
            for (int i=1;i<=m;i++)
            {
                printf("%d",a[i][m+1]);
                if (i%6==0) puts("");
                else printf(" ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Java基础之集合框架(Collection接口和List接口)
    Management
    .NET实现多个不同有效时间Session方案思考
    C#操作MySql数据库帮助类(Dapper,T-Sql)
    MVC控制器传递多个实体类集合到视图的方案总结
    高德js API根据出行方式和出现策略由起始点经纬度实现路线规划
    c#QQ邮件编程学习(收发邮件)
    自定义tt文本模板实现MySql指数据库中生成实体类
    Socket客户端
    Socket服务端
  • 原文地址:https://www.cnblogs.com/wutongtong3117/p/7673080.html
Copyright © 2011-2022 走看看