//增量构造法 #include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h> int cmp(const void *a,const void *b){ return strcmp((char *)a,(char *)b);}#define N 100int A[20];char s[N][16];char tmp[N][16];int t,p,n;int min;void turn(int *A, int cur){ memcpy(tmp,s,sizeof(s)); int cnt; cnt = p - cur; if(cnt>=min)return; for(int i=0;i<cur;i++) { for(int j=0;j<n;j++) tmp[j][A[i]]='0'; } qsort(tmp,n,sizeof(tmp[0]),cmp); for(int i=0;i<n-1;i++)if(strcmp(tmp[i],tmp[i+1])==0)return; min=cnt;} int num = 0; void dfs(int cur){ turn(A,cur); int s = cur?A[cur-1]+1:0; for (int i = s ; i < p ; i++) { A[cur] = i; printf("Case: %d ",num++); for(int j = 0; j <=cur; j++) { printf("%d ",A[j]); } putchar('\n'); dfs(cur+1); }} main() { scanf("%d",&t); FILE *fp; fp=fopen("in.txt","r"); while(t--) { scanf("%d %d",&p,&n); for(int i=0;i<n;i++) { for(int j=0;j<p;j++) { while(!isdigit(s[i][j]=fgetc(fp))); } s[i][p]='\0'; } min=p; dfs(0); printf("%d\n",min); } return 0;}
//位向量法#include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h> int cmp(const void *a,const void *b){ return strcmp((char *)a,(char *)b);}#define N 100char s[N][16];char tmp[N][16];int t,p,n;int min;bool visted[16];void turn(){ memcpy(tmp,s,sizeof(s)); int cnt=0; for(int i=0;i<p;i++)if(visted[i]==true)cnt++; if(cnt>=min)return; for(int i=0;i<p;i++) if(!visted[i]) { for(int j=0;j<n;j++) tmp[j][i]='0'; } qsort(tmp,n,sizeof(tmp[0]),cmp); for(int i=0;i<n-1;i++)if(strcmp(tmp[i],tmp[i+1])==0)return; min=cnt;}void dfs(int cur){ if(cur==p) turn(); else { visted[cur]=true; dfs(cur+1); visted[cur]=false; dfs(cur+1); }} main() { scanf("%d",&t); // FILE *fp; //fp=fopen("in.txt","r"); while(t--) { scanf("%d %d",&p,&n); for(int i=0;i<n;i++) { for(int j=0;j<p;j++) { while(!isdigit(s[i][j]=getchar())); } s[i][p]='\0'; } min=p; dfs(0); printf("%d\n",min); } return 0;}