uva 11205

来源:互联网 发布:数据备份系统品牌 编辑:程序博客网 时间:2024/05/19 22:04

给你一个LED显示板有P个灯,给你一个LED可以显示数字的序列,每个数字对应一个单独的灯的显示法,最少数目的灯作用时可以区分把这几个数字区分开了

   二进制状态压缩,暴力枚举每一种可以亮灯方式;


#include <iostream>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


using namespace std;


bool vis[1<<15];
int num[100]; //存每一种数字亮灯方法对应的值
int minn = 0x1f1f1f1;


int main()
{
    int t,p,n,a;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&p, &n);
        memset(vis, 0, sizeof(vis));
        bool flag = true;
        minn = 1000;
        for( int i = 0; i < n; i++)
        {
            int val = 0;
            for( int j = 0; j < p; j++)
            {
                scanf("%d",&a);
                val += a * (1 << j);
            }

            num[i] = val;
        }


        int tot = (1 << p) - 1;

       //枚举选择的灯是哪个,1表示选择,0,表示不选择

        for( int sta = 1; sta <= tot; sta++)
        {
            memset(vis ,0, sizeof(vis));

            int i;

          //检测

            for(  i = 0; i < n; i++)

           {

                int w = (sta & num[i]);
               if(!vis[w])
                 vis[w] = true;
               else
                 break;

            }

      //如果当前的选择方式下,每一种数字可以有唯一的显示方法,那么就算成功

            if( i == n)
            {
                int ans = 0;

                int temp = sta;

              //看下当前选择状态中有几个1,就代表有几个灯管选中

                while(temp)
                {
                    if(temp%2)
                     ans++;
                    temp /= 2;
                }
                minn = min(minn, ans);
            }


        }


        cout<<minn<<endl;
    }
    return 0;
}
0 0
原创粉丝点击