首页 > 其他分享 >208. 开关问题

208. 开关问题

时间:2024-12-03 11:34:47浏览次数:3  
标签:开关 int 208 cin 问题 ++ --

// 208. 开关问题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*

https://www.acwing.com/problem/content/210/

有 N 个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,
即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。

你的目标是经过若干次开关操作后使得最后 N 个开关达到一个特定的状态。

对于任意一个开关,最多只能进行一次开关操作。

你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)

输入格式
输入第一行有一个数 K,表示以下有 K 组测试数据。

每组测试数据的格式如下:

第一行:一个数 N。

第二行:N 个 0 或者 1 的数,表示开始时 N 个开关状态。

第三行:N 个 0 或者 1 的数,表示操作结束后 N 个开关的状态。

接下来每行两个数 I,J,表示如果操作第 I 个开关,第 J 个开关的状态也会变化。

每组数据以 0 0 结束。

输出格式
每组数据输出占一行。

如果有可行方法,输出总数,否则输出 Oh,it's impossible~!! 。

数据范围
1≤K≤10,
0<N<29
输入样例:
2
3
0 0 0
1 1 1
1 2
1 3
2 1
2 3
3 1
3 2
0 0
3
0 0 0
1 0 1
1 2
2 1
0 0
输出样例:
4
Oh,it's impossible~!!

*/


#include <iostream>
#include <cstring>

using namespace std;

const int N = 30;
int a[N][N];
int T; int n;

int gauss()
{
    int c, r;
    for (c = 0, r = 0; c < n; c++)
    {
        int t = r;
        for (int i = r; i < n; i++)
            if (a[i][c])
                t = i;

        if (!a[t][c]) continue;

        for (int i = c; i <= n; i++) swap(a[r][i], a[t][i]);
        for (int i = r + 1; i < n; i++)
            if (a[i][c])
                for (int j = n; j >= c; j--)
                    a[i][j] ^= a[i][c] & a[r][j];

        r++;
    }
    int ret = 1;
    if (r < n)
    {
        for (int i = r; i < n; i++) {
            if (a[i][n]) {
                cout << "Oh,it's impossible~!!" << endl;
                return -1;
            }
            ret <<= 1;
        }

        cout << ret << endl;
        return 2;
    }

    for (int i = n - 1; i >= 0; i--)
        for (int j = i + 1; j < n; j++)
            a[i][n] ^= a[i][j] * a[j][n];
    cout << 1 << endl;
    return 0;
}


void solve() {
    cin >> n;
    memset(a, 0, sizeof a);
    for (int i = 0; i < n; i++) {
        cin >> a[i][n];
    }
    for (int i = 0; i < n; i++) {
        int t; cin >> t;
        a[i][n] ^= t;
    }
    int t, k;
    while (cin >> t >> k) {
        if (t == 0 && k == 0) break;
        t--; k--;
        a[k][t] = 1;
    }
    for (int i = 0; i < n; i++) {
        a[i][i] = 1;
    }


    gauss();
}

int main()
{
    cin >> T;

    while (T--) {
        solve();
    }


    return 0;
}

标签:开关,int,208,cin,问题,++,--
From: https://www.cnblogs.com/itdef/p/18583730

相关文章

  • 启动应用程序出现uwfcfgmgmt.dll找不到问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个uwfcfgmgmt.dll文件(挑选合适的版本文件)把......
  • 启动应用程序出现uwfcsp.dll找不到问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个uwfcsp.dll文件(挑选合适的版本文件)把它放......
  • 启动应用程序出现UusFailover.dll找不到问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个UusFailover.dll文件(挑选合适的版本文件)把......
  • 编译opencv后的跨平台使用问题
    arm64上编译opencv得到opencv_world.so,放到x86_64平台,用CLion交叉编译arm64的程序时会报一堆的缺少依赖的so文件。/usr/lib/gcc-cross/aarch64-linux-gnu/9/../../../../aarch64-linux-gnu/bin/ld:warning:libjpeg.so.8,neededby/lib/aarch64-linux-gnu/libopencv_world.so......
  • 1303 [POJ 1830] 开关问题
    //1303[POJ1830]开关问题.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。///*http://oj.daimayuan.top/course/22/problem/1080有n个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生......
  • [编程笔记] JavaScript作用域问题
    很有意思的一个bug,起初看到同事对一段代码的批注:批注地方的代码(也就是for里面的i),在实际触发时,返回是是7,而理想情况下我们希望点击哪个datagrid就返回哪个i,实际则是每次都是7,也就是for结束后的结果,6,i++,所以是7。那么为什么会这样呢?抱着好奇的......
  • 宇视网络摄像机IPC通过国标28181协议,无法接入国产系统部署的视频接入汇聚平台的问题解
    目录一.客户问题具体描述二.问题解决过程2.1网络排查2.2检查摄像机本身设置三.问题排查结果3.1平台查看设备是否在线3.2设置相关观看权限3.2.1新增并设置相关资源组3.2.2设置需要观看视频的角色3.2.3设置客户端登录用户3.3最终观看结果四.补充知识4.1ping的相关知......
  • 【全流程】eclipce解决javaweb项目向数据库插入中文字符时乱码问题
    问题背景:使用jdk1.8tomcat9.0.72eclipce2021版本maven2-8-4问题描述:制作javaweb项目时想实现向数据库里增加值,传英文没问题,但是传中文时发现乱码,最开始我以为是传输问题解决过程:建议按流程自己检查一遍1.先检查数据库字母集2,检查eclipce软件设置,按我发的第三篇参考......
  • js如何解决数字精度丢失的问题?
    JavaScript使用IEEE754标准的双精度浮点数来表示数字,这会导致在处理某些十进制数时出现精度丢失的问题。例如,0.1+0.2的结果不是0.3,而是0.30000000000000004。以下是一些解决JavaScript数字精度丢失问题的常用方法:1.使用整数进行计算:如果可能,尽量使用整数进行计算,......
  • 如果修改权限后仍然遇到“会话目录写入权限不足”的问题,应该怎么办
    如果修改权限后仍然遇到“会话目录写入权限不足”的问题,可以尝试以下几种方法:检查文件所有者:确保这些目录的文件所有者是Web服务器用户(通常是www-data或apache)。可以使用以下命令检查和修改文件所有者:chown-Rwww-data:www-data/path/to/your/domain/configchown-Rwww-......