• 解药还是毒药(codevs 2594)


    2594 解药还是毒药

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
     
     
    题目描述 Description

    Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那…那是解药还是毒药啊?)……,经过Smart的努力,终于弄清了每种药的具体性能,他会把每种药能治愈的病症和能使人患上的病症列一张清单给你,然后你要根据这张清单找出能治愈所有病症的最少药剂组合……顺便说一声,病症的数目不超过10种,而且他的药是用不完的,就是说每种药剂都可以被重复使用。

    输入描述 Input Description

    给你们的单子里第一行是病症的总数n(1≤n≤10)。第二行是药剂的种类m(0<m≤100)。

    以下有m行,每行有n个数字用空格隔开,文件的第i+2行的n个数字中,如果第j个数为1,就表示第i种药可以治愈病症j(如果患有这种病的话则治愈,没有这种病则无影响),如果为0表示无影响,如果为-1表示反而能使人得上这种病(无病患上,有病无影响)。Smart制的药任何两种性能都不同。

    输出描述 Output Description

    你只要输出用的最少的药剂数就可以了,其实还有可能用尽了所有的药也不能将所有病治愈,那样的话你们只要输出“The patient will be dead.”就可以了。

    样例输入 Sample Input

    3

    2

    1 0 1

    -1 1 0

    样例输出 Sample Output

    2

    数据范围及提示 Data Size & Hint

    1≤n≤10

    0<m≤100

    二进制、哈希判重加广搜

    #include<cstdio>
    #include<iostream>
    #define M 1100
    using namespace std;
    struct node
    {
        int f[M];//病人的状态 
        int dep;//步骤数 
    };node q[M];
    int a[M][M],num[M],hash[M],n,m,head,tail,sum,flag;
    void bfs()
    {
        while(head<=tail)
        {
            for(int i=1;i<=n;i++)
            {
                int tot=0;
                tail++;tot=0;
                for(int j=1;j<=m;j++)
                {
                    if(a[i][j]==1)q[tail].f[j]=1;
                    else if(a[i][j]==0)q[tail].f[j]=q[head].f[j];
                    else q[tail].f[j]=0;
                    if(q[tail].f[j]==1) tot+=num[j];
                }
                if(!hash[tot])
                {
                    hash[tot]=1;
                    q[tail].dep=q[head].dep+1;
                    if(tot==sum)
                    {
                        printf("%d",q[tail].dep);
                        flag=1;
                        return;
                    }
                }
                else tail--;
            }
            head++;
        }
    }
    void init()
    {
        num[1]=2;
        sum=2;
        for(int i=2;i<=m;i++)
          num[i]=num[i-1]*2,
          sum+=num[i];
    }
    int main()
    {
        scanf("%d%d",&m,&n);
        init();
        for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
        bfs();
        if(!flag)printf("The patient will be dead.");
        return 0;
    }
    View Code
  • 相关阅读:
    OpenCV人脸检测
    和机器学习和计算机视觉相关的数学(转载)
    操作系统课程设计 消息缓冲队列通信
    操作系统课程设计 线程的同步与互斥
    嵌入式考试Shell编程题
    Bash基础知识
    开始学习Shell/bash 加减乘运算
    RT-Thread Mini2440串口驱动
    Mini2440裸机RTC时钟驱动转化为字符串显示
    Mini2440裸机液晶屏TD35驱动
  • 原文地址:https://www.cnblogs.com/harden/p/5581426.html
Copyright © 2020-2023  润新知