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;
}