33,008
社区成员
发帖
与我相关
我的任务
分享
bool Find(std::vector<std::vector<int>> & in,std::vector<int> & out1,std::vector<int> & out2) {
unsigned int flag[64];
memset(flag,0,sizeof(flag));
out1.clear();
out2.clear();
for ( int i=0;i<in.size();++i ) {
unsigned char n = 0;
unsigned int sn = 0;
std::vector<int> & v = in[i];
for ( int j=0;j<v.size();++j ) {
n += (0x01<<(v[j]-1));
sn *= 10;
sn += v[j];
}
if ( 0!=flag[n] ) {
unsigned int s = flag[n];
while( s>0 ) {
out1.insert(out1.begin(),s%10);
s /= 10;
}
out2 = v;
return true;
}
flag[n] = sn;
}
return false;
}
#include <stdio.h>
#include <stdlib.h>
/*简化问题:假设m * n中矩阵元素非负,同行元素互不相等且最大值不超过32
将元素值视为二进制中为1的位数,如此将集合元素映射到一个数值,而不用
关心元素的顺序,处理映射后的值,问题转变为数组中寻找相同的元素
*/
#define DEM 6
int equal_set(int (*data)[DEM], int m, int n)
{
unsigned int map[m];
int i, j;
if(!data || m < 0 || n < 0)
return -1;
//映射
for(i = 0; i < m; ++i) {
map[i] = 0;
for(j = 0; j < n; ++j) { //将集合映射到数值
map[i] = map[i] | 1 << data[i][j];
}
}
#if 1
int nr;
//检索相等元素
for(i = 0; i < m; ++i) {
nr = 0;
for(j = i + 1; j < m; ++j) {
if(map[j] && (map[i] ^ map[j]) == 0) { //相同
printf("%d ", j);
map[j] = 0; //清空,避免相等元素重复输出
++nr; //计数
}
}
if(nr)
printf("%d ; sum : %d\n", i, ++nr);
}
#else
//上面检索相对慢些,可以考虑使用hash,提高速度
#endif
return 0;
}
void test(void)
{
int data[DEM][DEM] = {
1,2,3,4,5,6,
1,3,2,4,6,5,
3,5,1,4,6,2,
1,7,2,4,6,5,
1,2,7,4,5,6,
1,3,4,2,6,5,
};
equal_set(data, DEM, DEM);
}
int main(int argc, char *argv[])
{
test();
exit(0);
}
抛砖引玉