重点是想到如何使Hamming距离最小——分别检索每一列,取出各列出现频率最高的字母即可。
代码如下:
#include <iostream>
using namespace std;
char s[55][110];
char maxs[110];
char maxs_4(int a, int b, int c, int d) {
if (a >= b && a >= c && a >= d)
return 'A';
else if (d > a && d >= b && d >= c)
return 'C';
else if (c > a && c >= b && c > d)
return 'G';
else if (b > a && b > c && b > d)
return 'T';
else
return 0;
}
int main() {
int m, n, T, i, j;
cin >> T;
while (T--) {
int sum = 0;
cin >> m >> n;
for (i = 0; i < m; i++) {
cin >> s[i];
}
for (i = 0; i < n; i++) {
int a = 0, t = 0, g = 0, c = 0;
for (j = 0; j < m; j++) {
switch (s[j][i]) {
case 'A':a++; break;
case 'T':t++; break;
case 'G':g++; break;
case 'C':c++; break;
default:break;
}
}
maxs[i] = maxs_4(a, t, g, c);
}
int len = i;
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
if (maxs[j] != s[i][j])
sum++;
}
}
for (i = 0; i < len; i++) {
cout << maxs[i];
}
cout << endl << sum << endl;
}
return 0;
}