uva11205损坏的步数计

来源:互联网 发布:淘宝代购太平鸟真假 编辑:程序博客网 时间:2024/05/13 21:19
//增量构造法 #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;}
	
				
		
原创粉丝点击