3

次の行列Aがある場合:

A = {1,2,3}
    {7,9,1}
    {5,3,2}

マトリックス内の異なる行の数を簡単に返すにはどうすればよいですか?この場合、出力は「3」でなければなりません。

関数「」を作成しようとしました:

void rows (int a[N][N], int row[N], int x){

    for (int i=0;i<N;i++){

        row[i]=a[x][i];


    }

}

次に、関数「check」を使用して、行が異なるかどうかを確認しようとしました。

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;

}

しかし、間違った番号を返します、何か提案はありますか?

4

3 に答える 3

6

あなたのアルゴリズムは完全に間違っています。を追加breakすると、すべての行が異なる場合に「機能」しますが、一部の行が同じである場合は機能しません。それとは異なる別の行が存在するように、行の数をカウントします。たとえば、

1 2 3
4 5 6
1 2 3

あなたは答えを得ますが3、あなたは得るべきです2

アルゴリズムは次のようになります。

  • すべての行が異なると仮定します ( result = N)
  • 行ごとiに、その下の行を見てください
  • j行の下の行のいずれかiが と等しい場合row[i]、 をデクリメントしresultて内側のループから抜け出します。
  • 外側のループの最後に、result答えが含まれています。
于 2012-07-18T10:38:05.117 に答える
1

setの述語として「CompareRows」ファンクターを実装します。次に、あなたがする必要があるのは-

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();
于 2012-07-18T22:53:41.057 に答える
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++;
}

単一の要素の不等式でさえ、行が不等式になりますよね?

于 2012-07-18T10:29:49.880 に答える