hdu1560 搜索

从原串的最大长度开始枚举,当某个长度的值能保存所有串时,即成功。对每个长度进行深搜,每次取某个串的第一个。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
char str[8][6];
int flag=0,len[10],n;
int getlen(int *a)
{
    int i,ans=0;
    for(i=0;i<n;i++)
        ans=max(ans,a[i]);
    return ans;
}
void IDA(int *l,int nowlen)
{
    int i,j;
    if(flag)//找到了,便不用再往下找
        return ;
    if(getlen(l)>nowlen)//剩下的串中最短的串比预计长度要长
        return ;
    if(nowlen==0)//找到,进行标记
    {
        flag=1;
        return ;
    }
    int vi[10];
    memset(vi,0,sizeof(vi));
    for(i=0;i<n;i++)
    {
        if(!vi[i]&&l[i])//没有取出剩下串的首字符
        {
            int temp[10];
            for(j=0;j<n;j++)
                temp[j]=l[j];
            vi[i]=1;
            char ch=str[i][len[i]-l[i]];
            temp[i]--;
            for(j=i+1;j<n;j++)
            {
                if(str[j][len[j]-l[j]]==ch&&!vi[j]&&l[j])
                {
                    vi[j]=1;
                    temp[j]--;
                }
            }
            IDA(temp,nowlen-1);
        }
    }
    return ;
}
int main()
{
    int i,j,t,low;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        low=0;
        for(i=0;i<n;i++)
        {
            scanf("%s",&str[i]);
            len[i]=strlen(str[i]);
            low=max(low,len[i]);
        }
        flag=0;
        while(1)
        {
            IDA(len,low);
            if(flag)
            {
                printf("%d\n",low);
                break;
            }
            low++;
        }
    }
    return 0;
}

 

posted @ 2013-07-08 11:10  fangguo  阅读(148)  评论(0编辑  收藏  举报