作业 单词拼接

来源:互联网 发布:怀化干部教育网络 编辑:程序博客网 时间:2024/06/02 19:20

#include <string.h>    

#include <stdio.h>    
#include <stdlib.h>    
#define Maxsize 1010    
struct Node{    
    int to;    
}e[30][100];    
int indegree[30];    
int outdegree[30];    
int next[Maxsize];    
char str[Maxsize][35];    
int que[Maxsize];    
bool vis[Maxsize];    
int top;    
int m;    
int count;    
int cmp(const void *a,const void *b)    
{    
    return strcmp((char *)a,(char *)b);    
}    
void init()    
{    
    for(int i=0;i<30;i++)    
    {e[i][0].to=0;}    
    memset(indegree,0,sizeof(indegree));    
    memset(outdegree,0,sizeof(outdegree));    
    memset(vis,0,sizeof(vis));    
    count=m;top=0;    
}    
bool dfs(int u,int c)    
{    
    if(c==count)    
        return true;    
    for(int i=1;i<=e[u][0].to;i++)    
    {    
        Node &E=e[u][i];    
        if(!vis[E.to])    
        {    
            vis[E.to]=1;    
            que[top++]=E.to;    
            if(dfs(next[E.to],c+1))    
                return true;    
            top--;    
            vis[E.to]=0;    
        }    
    }    
    return false;    
}    
int main()    
{    
    int n;    
    int i;    
    scanf("%d",&n);    
    while(n--)    
    {    
        scanf("%d",&m);    
        int l,r;    
        init();    
        for(i=0;i<m;i++)    
        {    
            scanf("%s",str[i]);    
        }    
        qsort(str,m,sizeof(str[0]),cmp);    
        for(i=0;i<m;i++)    
        {    
            l=str[i][0]-'a';    
            int t=++e[l][0].to;e[l][t].to=i;    
            r=strlen(str[i])-1;    
            next[i]=str[i][r]-'a';    
            outdegree[l]++;indegree[next[i]]++;    
        }    
        int flag=0;    
        for(i=0;i<26;i++)    
            if(indegree[i]!=outdegree[i])    
                flag++;     
        if(flag!=2&&flag!=0)    
        {    
            printf("***\n");    
            continue;    
        }    
        if(flag==2)    
        {    
            for(i=0;i<26;i++)    
                if(outdegree[i]-1==indegree[i])    
                {    
                    dfs(i,0);    
                    break;    
                }    
        }    
        else dfs(0,0);    
        if(top!=m)    
        {    
            printf("***\n");    
            continue;    
        }    
        for(i=0;i<top-1;i++)    
            printf("%s.",str[que[i]]);    
        printf("%s\n",str[que[top-1]]);    
    }    
    return 0;    
}    


原创粉丝点击