#include<stdio.h>
#include<math.h>
#include<string.h>
char a[51][1001];
char b[1001];
int main()
{
int n,m,Dlength,DiZhi;
scanf("%d",&n);
while(n--){
int numA = 0 , numC=0 , numG = 0 , numT = 0 , numH = 0;
scanf("%d%d",&m,&Dlength);
DiZhi = 0;
for(int i = 0 ; i<m ; i++){
scanf("%s",a[i]);
}
for(int j = 0; j < Dlength ; j++){
numA = 0 , numC=0 , numG = 0 , numT = 0 , numH = 0;
for(int i = 0; i < m ; i++){
if(a[i][j] == 'A'){
numA++;
}
if(a[i][j] == 'C'){
numC++;
}
if(a[i][j] == 'G'){
numG++;
}
if(a[i][j] == 'T'){
numT++;
}
}
if(numA>=numC&&numA>=numG&&numA>=numT){
b[DiZhi] = 'A'; //也可以使用sprintf(b,"%s%c",b,'A');
DiZhi++;
continue;
}
if(numC>=numA&&numC>=numG&&numC>=numT){
b[DiZhi] = 'C';
DiZhi++;
continue;
}
if(numG>=numC&&numG>=numA&&numG>=numT){
b[DiZhi] = 'G';
DiZhi++;
continue;
}
if(numT>=numC&&numT>=numG&&numT>=numA){
b[DiZhi] = 'T';
DiZhi++;
continue;
}
}
b[DiZhi] = '\0';
for(int j = 0; j<Dlength ; j++){
for(int i = 0; i<m ; i++){
if(a[i][j]!=b[j]) numH++;
}
}
printf("%s\n%d\n",b,numH);
}
return 0;
}
/*
题目意思:找到最小的共识DNA序列(如果有多个,输出字典序最小的那个),
并输出它与其他的DNA序列的Hamming之和。
1. 输入n —》n个例子 , 设置a[51][1001]二维数组,设置b[1001]
2.while 输入m,Dlength,表示这个例子中有m个DNA序列,每个序列有Dlength长
3.设置numA,numC,numG,numT存储字符串的个数。设置Hnum表示Hamming之和
4. for(int j = 0; j < Dlength ; j++){
for(int i = 0; i < m ; i++){
if(a[i][j] == 'A'){
numA++;
}
..
..
..
}
if(numA>=numC&&numA>=numG&&numA>=numT){
sprintf(b,"%s%c",b,'A');
continue;
}
..
..
..
}
for(int j = 0; j<Dlength ; j++){
for(int i = 0; i<m ; i++){
if(a[i][j]!=b[i]) Hnum++;
}
}
5.输出 b[]\n 输出Hnum\n;
*/
的使用是在本地创造一个input.txt文件,里面装入输入,输出的数据则
输出在output.txt文件(也是自己创造)中。
*/
#include<math.h>
#include<string.h>
char a[51][1001];
char b[1001];
int main()
{
int n,m,Dlength,DiZhi;
scanf("%d",&n);
while(n--){
int numA = 0 , numC=0 , numG = 0 , numT = 0 , numH = 0;
scanf("%d%d",&m,&Dlength);
DiZhi = 0;
for(int i = 0 ; i<m ; i++){
scanf("%s",a[i]);
}
for(int j = 0; j < Dlength ; j++){
numA = 0 , numC=0 , numG = 0 , numT = 0 , numH = 0;
for(int i = 0; i < m ; i++){
if(a[i][j] == 'A'){
numA++;
}
if(a[i][j] == 'C'){
numC++;
}
if(a[i][j] == 'G'){
numG++;
}
if(a[i][j] == 'T'){
numT++;
}
}
if(numA>=numC&&numA>=numG&&numA>=numT){
b[DiZhi] = 'A'; //也可以使用sprintf(b,"%s%c",b,'A');
DiZhi++;
continue;
}
if(numC>=numA&&numC>=numG&&numC>=numT){
b[DiZhi] = 'C';
DiZhi++;
continue;
}
if(numG>=numC&&numG>=numA&&numG>=numT){
b[DiZhi] = 'G';
DiZhi++;
continue;
}
if(numT>=numC&&numT>=numG&&numT>=numA){
b[DiZhi] = 'T';
DiZhi++;
continue;
}
}
b[DiZhi] = '\0';
for(int j = 0; j<Dlength ; j++){
for(int i = 0; i<m ; i++){
if(a[i][j]!=b[j]) numH++;
}
}
printf("%s\n%d\n",b,numH);
}
return 0;
}
/*
题目意思:找到最小的共识DNA序列(如果有多个,输出字典序最小的那个),
并输出它与其他的DNA序列的Hamming之和。
1. 输入n —》n个例子 , 设置a[51][1001]二维数组,设置b[1001]
2.while 输入m,Dlength,表示这个例子中有m个DNA序列,每个序列有Dlength长
3.设置numA,numC,numG,numT存储字符串的个数。设置Hnum表示Hamming之和
4. for(int j = 0; j < Dlength ; j++){
for(int i = 0; i < m ; i++){
if(a[i][j] == 'A'){
numA++;
}
..
..
..
}
if(numA>=numC&&numA>=numG&&numA>=numT){
sprintf(b,"%s%c",b,'A');
continue;
}
..
..
..
}
for(int j = 0; j<Dlength ; j++){
for(int i = 0; i<m ; i++){
if(a[i][j]!=b[i]) Hnum++;
}
}
5.输出 b[]\n 输出Hnum\n;
*/
/*
注意事项:1.如果b是二维数组,那么比较和添加会麻烦很多。
2.freopen("input.txt","r",stdin) 与 freopen("output.txt","w",stdout);的使用是在本地创造一个input.txt文件,里面装入输入,输出的数据则
输出在output.txt文件(也是自己创造)中。
*/