题意理解了就不难了,就是问取多少列能区分所有行,列可以是不连续的
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
int n,p,min,a[200][20],used[20];
char s[200][20];
void change(int *A,int cc)//转换成字符串
{
int i,j,num;
for(i=0;i<n;i++)
{
num=0;
for(j=0;j<cc;j++)
s[i][num++]=a[i][A[j]]+'0';
s[i][num]='\0';
}
}
/*void print()
{
int i,j;
for(i=0;i<n;i++)
puts(s[i]);
}*/
int judge()//判断是否可以区分所有行
{
int i,j;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(strcmp(s[i],s[j])==0)
return 0;
return 1;
}
void dfs(int x)//取所有子集
{
int i;
int num,A[20];
if(p==x)
{
num=0;
memset(s,0,sizeof(s));
for(i=0;i<p;i++)
if(used[i])
A[num++]=i;
change(A,num);
//print();
if(judge())
{
if(num<min)
min=num;
}
return ;
}
used[x]=1;
dfs(x+1);
used[x]=0;
dfs(x+1);
}
main()
{
int i,j,t;
//freopen("D:\\ppp.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
memset(used,0,sizeof(used));
scanf("%d%d",&p,&n);
for(i=0;i<n;i++)
{
for(j=0;j<p;j++)
scanf("%d",&a[i][j]);
}
min=20;
dfs(0);
printf("%d\n",min);
}
return 0;
}