废话不多说,代码直接上
////////////////////////////
//Title:hdu 1583 dna assembly
//Code by:汇蓝鸟
//程序在windows7 VC6.0下编译通过并满足题目条件
//////////////////////////////
#include
#include
#include
int DNACom(char *DNA_A,char *DNA_B)//用于验证两DNA片段公用的碱基个数
{
int DNA_offset=0;
while(*(DNA_A+DNA_offset))
{
if(*(DNA_A+DNA_offset)==*(DNA_B+DNA_offset))
{
DNA_offset++;
}
else
{
DNA_A++;
DNA_offset=0;
}
}
return DNA_offset;
}
int GetDNAComMAX(char *DNA_A,char *DNA_B)
{
int n1=DNACom(DNA_A,DNA_B);
int n2=DNACom(DNA_B,DNA_A);
return n1>n2?n1:n2;
}
bool legDNA(char *DestDNA)//判断DNA合法性,虽然题目中没说,但还是写上好
{
while(*(DestDNA))
{
if(*DestDNA!='A'&&*DestDNA!='G'&&*DestDNA!='C'&&*DestDNA!='T')
return false;
DestDNA++;
}
return true;
}
void mergedDNA(char *DNA_A,char *DNA_B)//连接两个DNA片段
{
char DNA_Buf[1024];
memset(DNA_Buf,0,sizeof(DNA_Buf));
int Com1=DNACom(DNA_A,DNA_B);
int Com2=DNACom(DNA_B,DNA_A);
if(Com1>Com2)
{
strcpy(DNA_Buf,DNA_A);
strcat(DNA_Buf,DNA_B+Com1);
}
else
{
strcpy(DNA_Buf,DNA_B);
strcat(DNA_Buf,DNA_A+Com2);
}
strcpy(DNA_A,DNA_Buf);
}
void main()
{
int nDNA,MAXCom=0,DNANeedMerge1,DNANeedMerge2;
char DNASequences[255][1024];//最终决定不采用链表,用数组和谐
bool UsingFlag[255];
printf("请输入您要输入的DNA片段个数:");
scanf("%d",&nDNA);
printf("请输入DNA片段:\n");
for(int i=0;i
scanf("%s",DNASequences[i]);
if(!legDNA(DNASequences[i]))
{
printf("\n输入的DNA不合法,重新输入\n");
i--;
continue;
}
}
for(i=1;i<=255;i++)
{
UsingFlag[i]=true;
}
//穷举实现公共碱基数目最大的先合成,合成结果放在数组靠前的那个数组中,最大支持1024个碱基
for(int z=0;z
for(i=0;i
{
if(UsingFlag[i]&&UsingFlag[j])
if(MAXCom
MAXCom=GetDNAComMAX(DNASequences[i],DNASequences[j]);
DNANeedMerge1=i;
DNANeedMerge2=j;
}
}
mergedDNA(DNASequences[DNANeedMerge1],DNASequences[DNANeedMerge2]);
UsingFlag[DNANeedMerge2]=false;
MAXCom=0;
}
printf("\n最后的DNA结果是%s\n最终合成长度%d\n",DNASequences[0],strlen(DNASequences[0]));//最终结果在DNASequences[0]当中
}
//乍看之下程序的局限性还是有的,就是内存占用会比较多,最大也就支持1024个碱基(要增多改改数字就行了),采用链表会好很多,我这人比较懒,数组随便凑活用吧