HRBUST 1213 单词接龙

暴力搜索。

按照能配对的关系建立有向边,然后暴力搜索。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<algorithm>
#include<iostream>
using namespace std;

char s[30][300];
int n;
char op[5];
int G[30][30];
int ans,c[30],Len[30];

void get(int a,int b)
{
    int lena=Len[a], lenb = Len[b];

    for(int i=1;i<lena;i++)
    {
        if(lena-i>=lenb) continue;

        bool fail=0;

        int p1=i,p2=0;
        while(1)
        {
            if(s[a][p1]==0) break;
            if(s[a][p1]!=s[b][p2]) fail=1;
            p1++,p2++;
        }

        if(fail) continue;
        G[a][b]=lena-i;
    }

    if(G[a][b]==0) G[a][b]=-1;
}

void dfs(int x,int y)
{
    ans=max(ans,y);
    for(int i=1;i<=n;i++)
    {
        if(G[x][i]==-1) continue;
        if(c[i]==2) continue;
        c[i]++;
        dfs(i,y+Len[i]-G[x][i]);
        c[i]--;
    }
}

int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]),Len[i]= strlen(s[i]);
        scanf("%s",op);

        memset(G,-1,sizeof G);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++) get(i,j);

        ans=0;
        for(int i=1;i<=n;i++)
        {
            if(op[0]!=s[i][0]) continue;
            memset(c,0,sizeof c);
            c[i]++; dfs(i,Len[i]);
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

posted @ 2017-03-08 11:48  Fighting_Heart  阅读(211)  评论(0编辑  收藏  举报