DNA序列(DNA Consensus String, ACM/ICPC Seoul 2006, UVa1368)

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

猜你喜欢

转载自blog.csdn.net/qq_40883132/article/details/79475594