UVA 11205 The broken pedometer
题目大意:给出几行数字组合,求出至少取几列可以分辨出不同行
解题思路:刚刚开始学子集生成,方法比较笨,位向量法生成子集,去二进制数,然后排序,求相邻的数是否都不相同
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>
using namespace std;
int m, l;
int num[100][100];
int num2[100];
int com[100];
int mi;
int cmd(const void *a, const void *b) {
return *(int*)a - *(int*)b;
}
void sol(int a, int b) {
if(m == 1) {
mi = 0;
return;
}
if(a == l && b == 0)
return;
if(a == l) {
memset(com, 0, sizeof(com));
for(int i = 0; i < l; i++)
if(num2[i] == 1) {
for(int j = 0; j < m; j++)
com[j] = com[j] + num[j][i] * pow(2, i);
}
qsort(com, m, sizeof(int), cmd);
for(int i = 1; i < m; i++) {
if(com[i] == com[i-1])
return;
}
if(b < mi)
mi = b;
return;
}
num2[a] = 0;
sol(a+1, b);
num2[a] = 1;
sol(a+1, b+1);
}
int main() {
int n;
cin >> n;
while(n--) {
memset(num, 0, sizeof(num));
memset(num2, 0, sizeof(num2));
cin >> l;
cin >> m;
for(int i = 0; i < m; i++) {
for(int j = 0; j < l; j++)
cin >> num[i][j];
}
mi = l;
sol(0, 0);
cout << mi << endl;
}
return 0;
}