如果我有以下矩阵A:
A = {1,2,3}
{7,9,1}
{5,3,2}
我如何轻松返回Matrix中不同行的数量?在这种情况下,输出必须是:“3”
我尝试创建一个“行”函数:
void rows (int a[N][N], int row[N], int x){
for (int i=0;i<N;i++){
row[i]=a[x][i];
}
}
然后,使用“检查”功能,我试图检查行是否不同:
int check ( int a[N][N])
{
int row1[N];
int row2[N];
int j=0;
rows(a,row1,j);
rows(a,row2,j+1);
int count = 0;
for ( int i=0; i<N; i++){
for ( int j=0; j<N; j++){
if ( row1[i] != row2[j]){
count++;
}
}
}
return count;
}
但是返回错误的号码,有什么建议吗?
答案 0 :(得分:6)
你的算法完全错了。添加break
时,当所有行不同时,它“起作用”,但当某些行相同时它会中断。它计算行数,以便存在与其不同的另一行。例如,如果您在
1 2 3
4 5 6
1 2 3
您将得到答案3
,但您应该获得2
。
算法应该是这样的:
result = N
)i
,请查看其下方的行j
下方的任何行i
等于row[i]
,则递减result
并突破内循环result
包含您的答案。答案 1 :(得分:1)
尝试将不等式变量添加到:
int count = 0;
for ( int i=0; i<N; i++){
inequalty=0;
for ( int j=0; j<N; j++){
if ( row1[i] != row2[j]){
inequality=1;
break; //this makes even faster
}
}
if(inequality!=0)count++;
}
即使是单个元素的不等式也会使行不等?
答案 2 :(得分:1)
实现'CompareRows'仿函数作为set的谓词。然后,您需要做的就是 -
typedef vector<int> Rows;
set<Rows, CompareRows> UniqRows;
for ( int i = 0 ; i < N ; ++i )
UniqRows.insert(Rows(a[i], a[i] + N));
UniqRows.size();