DNA序列(DNA Consensus String)UVa1368

#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;
*/


/*

   注意事项:1.如果b是二维数组,那么比较和添加会麻烦很多。

                    2.freopen("input.txt","r",stdin)  与  freopen("output.txt","w",stdout);
                    的使用是在本地创造一个input.txt文件,里面装入输入,输出的数据则
                    输出在output.txt文件(也是自己创造)中。
*/

猜你喜欢

转载自blog.csdn.net/m0_37632283/article/details/80294240
DNA