说说:
这题开始的时候理解有错误,以为只要对每个位进行判断,即如果每个数的该位都不考虑,若出现两个数字完全相同,则该位是必须存在的,否则即是可有可无的。但是这么做其实是有问题的,因为这就默认对于某位的判断是基于其他位都是有效的情况。而事实上应当在将无效位全都去除之后,再对需要判断的位进行判断才是合理的,但这明显不能满足。因此在网上也看了一些其他人的解题报告,最简单的应该就是用位向量的方法了。即把P位数的每个位是否有效进行排列组合,列出所有情况进行判断,进行暴力求解即可。
源代码:
#include <stdio.h>
#include <string.h>
#define MAXP 15+5
#define MAXN 100+5
int s[MAXN][MAXP];
char cpy[MAXN][MAXP];
char valid[MAXP];
int N,P,ans;
void solve(int cur){
int i,j,count;
if(cur==P){
count=0;//记录有效位的个数
for(i=0;i<P;i++)
if(valid[i]){//有效位根据获取的数据填入
count++;
for(j=0;j<N;j++)
cpy[j][i]='0'+s[j][i];
}
else
for(j=0;j<N;j++)//无效位直接置零
cpy[j][i]='0';
for(i=0;i<N;i++) cpy[i][P]='\0';//不要忘记最后放置字符串结束标识
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
if(strcmp(cpy[i],cpy[j])==0)//若发现有重复,说明此种排序不行
return;
if(count<ans) ans=count;
return;
}
valid[cur]=0;//位向量法,列出所有情况
solve(cur+1);
valid[cur]=1;
solve(cur+1);
return;
}
int main(){
int i,j,k,T;
// freopen("data","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d",&P,&N);
for(i=0;i<N;i++)
for(j=0;j<P;j++)
scanf("%d",&s[i][j]);
ans=P;
solve(0);
printf("%d\n",ans);
}
return 0;
}The Broken Pedometer UVA 11205
原文地址:http://blog.csdn.net/u011915301/article/details/38962519