给你一个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;
}
//如果当前的选择方式下,每一种数字可以有唯一的显示方法,那么就算成功
{
int ans = 0;
int temp = sta;
//看下当前选择状态中有几个1,就代表有几个灯管选中
while(temp){
if(temp%2)
ans++;
temp /= 2;
}
minn = min(minn, ans);
}
}
cout<<minn<<endl;
}
return 0;
}