用迭代加深搜索来做,时间卡得挺紧,操作要精简,具体操作见代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cctype>
using namespace std;
const int N=10;
const char DNA[]="ACGT";
char str[N][N];
int ans,n;
int l[N],l0[N];
void dfs(int d,int md)
{
if(d>=md) return;
int ml=0;
for(int i=0;i<n;i++) //计算最少还需要几个序列长度
ml=max(l0[i]-l[i],ml);
if(ml>md-d) return; //剪枝
if(ml==0) //完成
{
ans=d;
return;
}
bool flag;
int temp[N];
memcpy(temp,l,sizeof(l));
for(int i=0;i<4;i++)
{
flag=false;
for(int j=0;j<n;j++)
if(str[j][l[j]]==DNA[i])
{
l[j]++;
flag=true;
}
if(!flag) continue;
dfs(d+1,md);
if(ans!=-1) break;
memcpy(l,temp,sizeof(l));
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%s",str[i]);
int len=0;
for(int i=0;i<n;i++) //计算序列长度,找出最大的
{
l0[i]=strlen(str[i]);
len=max(len,l0[i]);
}
ans=-1;
memset(l,0,sizeof(l));
while(1) //迭代加深
{
dfs(0,len);
if(ans!=-1) break;
len++;
}
printf("%d\n",ans);
}
return 0;
}