#include<stdio.h>
#include<string.h>
char s[100][2000];
int main()
{
int N,j,m,n,i,e,q;
char p;
scanf("%d",&N);
for(e=0;e<N;e++)
{
scanf("%d%d",&m,&n);
int A=0,T=0,G=0,C=0;//初始化
for(i=0;i<m;i++)
scanf("%s",s[i]);
q=0;
for(i=0;i<n;i++)//n代表每个序列的长度
{
for(j=0;j<m;j++)//m代表DNA串数
{
switch(s[j][i])
{
case 'A':A+=1;break; //统计每列的字母出现次数
case 'T':T+=1;break;
case 'G':G+=1;break;
case 'C':C+=1;break;
}
}
if(A>=T&&A>=G&&A>=C) //打印出现次数最多的和字典序最小的字母
{printf("A");p='A';}
else if(T>A&&T>G&&T>C)
{printf("T");p='T';}
else if(G>A&&G>C&&G>=T)
{printf("G");p='G';}
else if(C>A&&C>=T&&C>=G)
{printf("C");p='C';}
A=T=G=C=0; //千万别忘了重新初始化
int t;
//用q来统计Hamming距离
if(p!=s[t][i])
q+=1;
}
if(i==n-1)
printf("\n%d\n",q);
}
}
return 0;
#include<string.h>
char s[100][2000];
int main()
{
int N,j,m,n,i,e,q;
char p;
scanf("%d",&N);
for(e=0;e<N;e++)
{
scanf("%d%d",&m,&n);
int A=0,T=0,G=0,C=0;//初始化
for(i=0;i<m;i++)
scanf("%s",s[i]);
q=0;
for(i=0;i<n;i++)//n代表每个序列的长度
{
for(j=0;j<m;j++)//m代表DNA串数
{
switch(s[j][i])
{
case 'A':A+=1;break; //统计每列的字母出现次数
case 'T':T+=1;break;
case 'G':G+=1;break;
case 'C':C+=1;break;
}
}
if(A>=T&&A>=G&&A>=C) //打印出现次数最多的和字典序最小的字母
{printf("A");p='A';}
else if(T>A&&T>G&&T>C)
{printf("T");p='T';}
else if(G>A&&G>C&&G>=T)
{printf("G");p='G';}
else if(C>A&&C>=T&&C>=G)
{printf("C");p='C';}
A=T=G=C=0; //千万别忘了重新初始化
int t;
for(t=0;t<m;t++)
{//用q来统计Hamming距离
if(p!=s[t][i])
q+=1;
}
if(i==n-1)
printf("\n%d\n",q);
}
}
return 0;
}
解题的关键是怎么找这个最小的序列,只需要按列统计每列出现次数最多的字母就是要找的字母,每列都找到就找到最小序列了。