这么简单的题都出错了。因为忘了把检查过的结果给清除了,所以可能导致重复计算。

   比如AT,TA,AT这样的输入,应该只能组成一组,如果组完后没有丢弃AT,TA,就会导致检查完AT后继续检查TA,然后将已经使用过的TA去和AT做匹配!

   先贴下错误代码:

#include <iostream>
using namespace std;
bool match_c(char a, char b) {
    if( a == 'A' && b == 'T' )
        return true;
    else if ( a == 'T' && b == 'A')
        return true;
    else if ( a == 'C' && b == 'G')
        return true;
    else if ( a == 'G' && b == 'C')
        return true;
    else
        return false;
}
bool match(string a, string b){
    int len = a.size();
    int i;
    if( len != b.size() )
        return false;
    else{
        for( i = 0; i < len; i++) {
            if( !match_c(a[i], b[i] ))
                return false;
        }
        return true;
    }
}
int main() {
    int T, n;
    int i, j, k;
    int count;
    string d[100];
    cin >> T;
    for( i = 0; i < T; i++ ) {
        cin >> n;
        for ( j = 0; j < n; j++) {
            cin >> d[j];
        }
        count = 0;
        for ( j = 0; j < n; j++ ) {
            for( k = j+1; k < n; k++ ) {
                if( match(d[j], d[k]) )
                    count++;
            }
        }
        cout << count << endl;
    }
}


   然后正确代码:

#include <iostream>
using namespace std;
bool match_c(char a, char b) {
    if( a == 'A' && b == 'T' )
        return true;
    else if ( a == 'T' && b == 'A')
        return true;
    else if ( a == 'C' && b == 'G')
        return true;
    else if ( a == 'G' && b == 'C')
        return true;
    else
        return false;
}
bool match(string a, string b){
    int len = a.size();
    int i;
    if( len != b.size() )
        return false;
    else{
        for( i = 0; i < len; i++) {
            if( !match_c(a[i], b[i] ))
                return false;
        }
        return true;
    }
}
int main() {
    int T, n;
    int i, j, k;
    int count;
    string d[101];
    cin >> T;
    for( i = 0; i < T; i++ ) {
        cin >> n;
        for ( j = 0; j < n; j++) {
            cin >> d[j];
        }
        count = 0;
        for ( j = 0; j < n; j++ ) {
            if (d[j] != "") {
                for( k = j+1; k < n; k++ ) {
                    if( d[k] != "" && match(d[j], d[k]) ) {
                        d[j] = "";
                        d[k] = "";
                        count++;
                    }
                }
            }
        }
        cout << count << endl;
    }
    return 0;
}