很朴素的代码。。。
#include<bits/stdc++.h>
using namespace std;
bool cmp(string a,string b){
return a<b;
}
struct word_edge{
int to;
string word;
};
vector<word_edge> g[27];
vector<bool>mar[27];
int n,du[27][2],t1;
string a[1003];
queue<string> _out;
void dfs(int x,int u){
if(u==n){
while(!_out.empty()) {
cout<<_out.front();
if(_out.size()>1) cout<<".";
_out.pop();
}
exit(0);
}//找到欧拉路并输出
for(int i=0;i<g[x].size();i++){
if(!mar[x][i]) {
mar[x][i]=1;
_out.push(g[x][i].word);
dfs(g[x][i].to,u+1);
_out.pop();
mar[x][i]=0;
}
}//dfs求解
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
int st=int(a[i][0]-'a'+1),en=int(a[i][a[i].length()-1]-'a'+1);
word_edge t;
t.to=en;
t.word=a[i];
g[st].push_back(t);
mar[st].push_back(0);
du[st][0]++;
du[en][1]++;
}
int s=0,t=0,s1=0,sum=0;
for(int i=1;i<=26;i++){
// if(du[i][0]!=0||du[i][1]!=0) printf("%c 出:%d 入:%d\n",char(i+'a'-1),du[i][0],du[i][1]);
if(du[i][0]-du[i][1]==1) {
s++;
s1=i;
}
if(du[i][1]-du[i][0]==1) {
t++;
t1=i;
}
if(du[i][0]==du[i][1]) sum++;
}//找起点并判断欧拉路
if((s==1&&t==1&&sum+t+s==26)||(sum==26)){
if(s1==0) {
for(int i=1;i<=26;i++){
if(du[i][0]!=0) {
s1=i;
break;
}
}
}//回路情况找起点
dfs(s1,0);
}
printf("***");
return 0;
}