• POJ-1830


    Time Limit: 1000MS   Memory Limit: 30000K
    Total Submissions: 6294   Accepted: 2393

    Description

    有 N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关 的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一 次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)

    Input

    输入第一行有一个数K,表示以下有K组测试数据。
    每组测试数据的格式如下:
    第一行 一个数N(0 < N < 29)
    第二行 N个0或者1的数,表示开始时N个开关状态。
    第三行 N个0或者1的数,表示操作结束后N个开关的状态。
    接下来 每行两个数I J,表示如果操作第 I 个开关,第J个开关的状态也会变化。每组数据以 0 0 结束。

    Output

    如果有可行方法,输出总数,否则输出“Oh,it's impossible~!!” 不包括引号

    Sample Input

    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
    

    Sample Output

    4
    Oh,it's impossible~!!
    

    Hint

    第一组数据的说明:
    一共以下四种方法:
    操作开关1
    操作开关2
    操作开关3
    操作开关1、2、3 (不记顺序)

    /**
              题意:给一些开关,开某一个开关之后有的开关也会变化
              做法:高斯消元  线性代数
    **/
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #include <cmath>
    #define maxn 50
    using namespace std;
    int mmap[maxn][maxn];
    int start[maxn];
    int eed[maxn];
    int guess(int equ,int val)
    {
        int k=0,col = 0;
        int max_r = 0;
        for(k=0; k<equ&&col<val; k++,col++)
        {
            max_r = k;
            for(int i=k+1; i<equ; i++)
            {
                if(abs(mmap[i][col]) > abs(mmap[max_r][col]))
                {
                    max_r = i;
                }
            }
            if(max_r != k)
            {
                for(int i=k; i<val+1; i++)
                {
                    swap(mmap[k][i],mmap[max_r][i]);
                }
            }
            if(mmap[k][col] == 0)
            {
                k--;
                continue;
            }
            for(int i=k+1; i<equ; i++)
            {
                if(mmap[i][col] != 0)
                {
                    for(int j=col; j<val+1; j++)
                    {
                        mmap[i][j] ^= mmap[k][j];
                    }
                }
            }
        }
        ///上三角
        for(int i=k; i<equ; i++)
        {
            if(mmap[i][col]!=0) return -1;
        }
        return val-k;
    }
    int main()
    {
    //#ifndef ONLINE_JUDGE
    //    freopen("in.txt","r",stdin);
    //#endif // ONLINE_JUDGE
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n;
            scanf("%d",&n);
            memset(start,0,sizeof(start));
            memset(eed,0,sizeof(eed));
            for(int i=0; i<n; i++)
            {
                scanf("%d",&start[i]);
            }
            for(int i=0; i<n; i++)
            {
                scanf("%d",&eed[i]);
            }
            int u,v;
            memset(mmap,0,sizeof(mmap));
            while(scanf("%d %d",&u,&v))
            {
                if(u == 0 && v == 0) break;
                u--;
                v--;
                mmap[v][u] = 1;
            }
            for(int i=0; i<n; i++)
            {
                mmap[i][i] = 1;
            }
            for(int i=0; i<n; i++)
            {
                mmap[i][n] = start[i]^eed[i];
            }
            int res = guess(n,n);
            if(res == -1) printf("Oh,it's impossible~!!
    ");
            else printf("%d
    ",1<<res);
        }
        return 0;
    }
  • 相关阅读:
    根据系统的pid查询sql语句
    DORADO实现动态拼装查询条件
    一个Spring的配置管理接口
    MS SQL Server Management Studio连接到SQL Server命名实例的方法
    WSDL学习笔记
    显示MyBatis/Ibatis的SQL语句
    测试代码显示
    C#中一个项目中无法引用另外一个项目中的类的问题
    Learn How To Use LogMiner(Practice)
    WIN2003 IIS6 FastCGI php5.33配置重点
  • 原文地址:https://www.cnblogs.com/chenyang920/p/4521525.html
Copyright © 2020-2023  润新知