高斯消元--热身题

208.开关问题就是个解异或方程的高斯消元~
思路:就是你把所有要改变的灯置为1,表示要改变.放在增广矩阵的最后一行.然后把和当前灯有关系的开关置为1.然后进行消元,有k个自由源答案就是2^k..
代码如下:

#include <bits/stdc++.h>
using namespace std;
const int N=35;
int a[N][N],n;
int gauss()
{
    int r,c;
    for(r=1,c=1;c<=n;c++)
    {
        int t=r;
        for(int i=r+1;i<=n;i++)
        {
            if(a[i][c])
            {
                t=i;
            }
        }
        if(!a[t][c]) continue;
        for(int i=1;i<=n+1;i++)
        {
            swap(a[t][i],a[r][i]);
        }
        for(int i=r+1;i<=n;i++)
        {
            if(a[i][c])
            {
                for(int j=n+1;j>=c;j--)
                {
                    a[i][j]^=a[r][j];
                }
            }
        }
        r++;
    }

    int res=1;
    for(int i=r;i<=n;i++)
    {
        if(a[i][n+1]) return 0;
        res*=2;
    }
    return res;
}

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        memset(a,0,sizeof a);
        cin>>n;
        for(int i=1;i<=n;i++) {cin>>a[i][n+1];a[i][i]=1;}
        for(int i=1;i<=n;i++) {int z;cin>>z;a[i][n+1]^=z;}
        int x,y;
        while(cin>>x>>y,x||y) a[y][x]=1;
        int res=gauss();
        if(!res) puts("Oh,it's impossible~!!");
        else     cout<<res<<endl;
    }
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

10-22 12:03
山东大学 Java
程序员小白条:26届一般都得有实习,项目可以随便写的,如果不是开源社区的项目,随便包装,技术栈也是一样,所以本质应该找学历厂,多投投央国企和银行,技术要求稍微低一点的,或者国企控股那种,纯互联网一般都得要干活
应届生简历当中,HR最关...
点赞 评论 收藏
分享
10-17 23:18
已编辑
西北农林科技大学 Web前端
独行m:给25可以试试,但他只能给12,那就是纯纯的事精
秋招,不懂就问
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务