Written by Robert_Wang in Southwest University of Science And Technology.
输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量
小。两个等长字符串的Hamming距离等于字符不同的位置个数,例如,ACGT和GCGA的
Hamming距离为2(左数第1, 4个字符不同)。
输入整数m和n(4≤m≤50, 4≤n≤1000),以及m个长度为n的DNA序列(只包含字母
A,C,G,T),输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多
解,要求为字典序最小的解。例如,对于下面5个DNA序列,最优解为TAAGATAC。
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
#include<iostream> #include<algorithm> #include<string.h> #include<math.h> #include<ctype.h> using namespace std; struct DNA { char a[1001]; int Hamming; }p[100]; bool cmp(DNA a, DNA b) { if (a.Hamming == b.Hamming) return strcmp(a.a, b.a)<0; return a.Hamming < b.Hamming; } int main() { int n,m; int i, j, k; char s; while (cin >>m>> n) { for (i = 0; i < m; i++) { cin >> p[i].a; } int sum = 0; for ( k = 0; k < m; k++) { sum = 0; for (i = 0; i < n; i++)//列 { s = p[k].a[i]; for (j = 0; j < m; j++)//行 { if (s != p[j].a[i]) sum++; } } p[k].Hamming = sum; } sort(p, p+m,cmp); cout << "-----------------" << endl; for (i = 0; i < m; i++) { cout << p[i].a <<p[i].Hamming<< endl; } cout << "该DNA序列是 " << p[0].a << " Hamming距离是:" <<p[0].Hamming<< endl; } return 0; }