第一次做迭代加深操作,看了题解之后,根据自己的理解做出来的,但是该程序还是不够强大,比如讨论中的测试数据:
1
8
AAAAA
CCCCC
TTTTT
GGGGG
CACAC
AGGGA
TTTTT
GAGGA,程序在进入到17层迭代的时候,就一直卡在那里,不动了。由于该题数据比较水,所以还是以951Ms过了。
/*************************************************************************
> File Name: main.cpp
> Author:Eagles
> Mail:None
> Created Time: 2018年08月28日 星期二 20时32分32秒
> Description:HDU1560,迭代加深搜索
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
#define N 9
int n;
char dna[4]={'A','C','G','T'};
char s[N][N];//记录字符串
int pos[N];//记录每个字符串已经匹配了几个字符,初始化为0
int len[N];//记录每个字符串的长度
int deep;//迭代的深度
int ans;//最终的答案
int max(int a, int b)
{
return a>b?a:b;
}
//返回所有字符串中,还未匹配的最大长度
int left()
{
int re=0;
for (int i=0; i<n; i++)
re=max(re,len[i]-pos[i]);
return re;
}
void dfs(int layer)
{
if (layer+left()>deep)
return;
if (left()==0)//如果所有未匹配的长度为0,则说明所有匹配完成
{
ans=layer;
return;
}
for (int i=0; i<4&&(ans == -1); i++)//四个字母
{
int flag=0;
int backup[N];//用作备份的数组,如果下一层dfs不行,返回时,将pos数组还原会dfs之前的样子
for (int j=0; j<n&&(ans ==-1); j++)
{
backup[j]=pos[j];
if (dna[i]==s[j][pos[j]])//如果当前字符串能够匹配该字母
{
pos[j]++;
flag=1;//说明当前位置的字母至少能匹配一个字符串
}
}
if (flag)
{
dfs(layer+1);
if (ans != -1)
return;
for (int j=0; j<n; j++)
pos[j]=backup[j];//回溯,讲pos数组复原
}
}
}
int main()
{
int t;
while(~scanf("%d",&t))
{
while(t--)
{
deep=0;
int sum=0;
scanf("%d",&n);
for (int i=0; i<n; i++)
{
scanf("%s",s[i]);
len[i]=strlen(s[i]);
pos[i]=0;
deep=max(deep,len[i]);
sum+=len[i];
}
ans=-1;
while(1)
{
dfs(0);
if (ans != -1)
{
printf("%d\n",ans);
break;
}
deep++;
}
}
}
return 0;
}