单词拼接

描述

给你一些单词,请你判断能否把它们首尾串起来串成一串。

前一个单词的结尾应该与下一个单词的道字母相同。

aloha

dog

arachnid

gopher

tiger

rat

可以拼接成:aloha.arachnid.dog.gopher.rat.tiger

输入

第一行是一个整数N(0

输出

如果存在拼接方案,请输出所有拼接方案中字典序最小的方案。(两个单词之间输出一个英文句号”.”)
如果不存在拼接方案,则输出


样例输入

2
6
aloha
arachnid
dog
gopher
rat
tiger
3
oak
maple
elm

样例输出

aloha.arachnid.dog.gopher.rat.tiger


代码

#include
#include
#include
using namespace std;
#define M 1100
struct node{
    int s,e;
    char ch[40];
}path[M];
int re[M],vis[M],ru[M],chu[M],n;
bool cmp(node a,node b){
    return strcmp(a.ch,b.ch)<0;
}
int judge(){
    int ans=0;
    int i,c1,c2;
    c1=c2=0;
    for(i=0;i<26;++i){
        if(abs(ru[i]-chu[i]) >=2) //不是欧拉图 
            return -1;
        else if(ru[i]-chu[i]==1)
            c2++;
        else if(ru[i]-chu[i]==-1){
            c1++;
            ans=i;
        }
    }
    if(c1>1 || c2>1) return -1;//如果不是欧拉图 
    if(c2==0){//如果没有出度比入度小1的点 
        for(i=0;i<26;++i){
            if(chu[i])//找到一个为起点 
                return i;
        }
    }
    else return ans;//返回起点  
}
int dfs(int st,int cnt){
    if(cnt==n) return 1;
    for(int i=0;i//st!=path[i].s时 
        if(path[i].scontinue;
        if(path[i].s>st)//单词不能连起来 
            return 0;
        //st==path[i].s时 
        vis[i]=1;
        re[cnt]=i;
        if( dfs(path[i].e,cnt+1) )
            return 1;
        vis[i]=0;
    }
    return 0;
}
int main(){
    int t,i;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        memset(ru,0,sizeof(ru));
        memset(chu,0,sizeof(chu));
        for(i=0;iscanf("%s",path[i].ch);
            int len=strlen(path[i].ch);
            path[i].s= path[i].ch[0] - 'a';
            path[i].e= path[i].ch[len-1] - 'a';
            ru[ path[i].ch[len-1] - 'a' ]++;
            chu[ path[i].ch[0] - 'a' ]++;
        }
        int ok=judge();//找到图的起点 
        if(ok==-1){ 
            printf("***\n");
            continue;
        }
        sort(path,path+n,cmp);//排序之后以便后边的字典序输出 
        memset(vis,0,sizeof(vis));
        if(!dfs(ok,0)){
            printf("***\n");
            continue;
        }
        printf("%s",path[re[0]].ch);
        for(i=1;iprintf(".%s",path[re[i]].ch);
        }
        printf("\n");
    }
    return 0;
}

测试截图

单词拼接_第1张图片

AC截图

这里写图片描述

你可能感兴趣的:(POJ)