对于我,这个题最大的障碍是理解题意,题意应是:找出最少的LED灯,使得给出的每个数字能够被识别出来,最后输出灯的个数即可。
最好的算法是子集生成法。此处我使用的是位向量子集生成法:
代码如下:
#include <cstdio>
#include <cstring>
int str[100][20];
int p, n, t, min, id[20];
void subset(int p, int cur)
{
if(cur==p)
{
int sum = 0, c = 0;
for(int i = 0; i < p; i++)
sum+=id[i];
for(int i = 0; i < n; i++)
for(int j = i+1; j < n; j++)
{
c = 0;
for(int k = 0; k < p; k++)
if(id[k]&&str[i][k]==str[j][k])c++;
if(c==sum)return;
}
min = min>sum?sum:min;
return;
}
id[cur]=1;
subset(p,cur+1);
id[cur]=0;
subset(p,cur+1);
}
int main ()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&p,&n);
for(int i = 0; i < n; i++)
for(int j = 0; j < p; j++)
scanf("%d",&str[i][j]);
min = p;
subset(p, 0);
printf("%d\n",min);
}
return 0;
}