首页 > 代码库 > HRBUST 1213 单词接龙

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;}

 

HRBUST 1213 单词接龙