解题思路:只要你的答案串与样例所给差距最小,并且是字典序输出即可,本题关键在于一个一个输出,遍历 列 再遍历 行。
样例输入
3
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
6 10
ATGTTACCAT
AAGTTACGAT
AACAAAGCAA
AAGTTACCTT
AAGTTACCAA
TACTTACCAA
样例输出
TAAGATAC
7
ACGTACGTAA
6
AAGTTACCAA
12
代码示例
int main()
{
string gene[55];
int n;
cin>>n;//3
for(int i=0; i<n; i++)
{
// memset(gene,0,sizeof(gene));//这么写问题很大,你怎么能让一串数组=0??应该一个个等于
int s[4];
int num=0;
int hang,len;
cin>>hang>>len;//5,8
//printf("hangshu=%d,lieshu=%d\n",hang,len);
//printf("gene[0]=%s\n",s);
for(int j=0; j<hang; j++)//5
{
cin>>gene[j];
}
for(int k=0; k<len; k++)//遍历列!!!,竖直遍历
{
int A,G,C,T=0;
A=0;
G=0;
C=0;
T=0;
memset(s,0,sizeof(s));
for(int m=0; m<4; m++)
{
s[m]=0;
}
for(int j=0; j<hang; j++)//5
{
if(gene[j][k]=='A')//竖直遍历,挨个输出
{
s[0]++;
A=s[0];
}
else if(gene[j][k]=='G')
{
s[1]++;
G=s[1];
}
else if(gene[j][k]=='C')
{
s[2]++;
C=s[2];
// printf("s[2]=%d\n\n",s[2]);
}
else if(gene[j][k]=='T')
{
s[3]++;
T=s[3];
// printf("s[3]=%d\n\n",s[3]);
}
//printf("%d %d %d %d\n",A,G,C,T);
}
//printf("num=%d\n",num);
// printf("A=%d,G=%d,C=%d,T=%d",A,G,C,T);
if(A>=G&&A>=C&&A>=T)//观察是否有等于号,可以形成字典序输出
{
printf("A");
//printf("num=%d\n",num);
num+=G+C+T;
//printf("num=%d\n",num);
}
else if(G>A&&G>C&&G>=T)
{
// printf("s[0]=%d,s[1]=%d,s[2]=%d,s[3]=%d\n",s[0],s[1],s[2],s[3]);
printf("G");
num+=A+C+T;
}
else if(C>A&&C>=G&&C>=T)
{
printf("C");
num+=A+G+T;
}
else if(T>A&&T>G&&T>C)
{
printf("T");
num+=A+G+C;
}
}
cout<<endl;
cout<<num<<endl;
num=0;
//memset(gene,0,sizeof(gene));
}
}