test

来源:互联网 发布:telnet端口23在哪 编辑:程序博客网 时间:2024/05/21 05:44

#include <iostream>using namespace std;int degree_in[26],degree_out[26],edge_num,edge_order[1005];bool used[1005];struct Edge{       int start,end;       char word[25];}edges[1005];int CMP(const void* a,const void* b){       Edge *c=(Edge*)a,*d=(Edge*)b;       if(c->start!=d->start) return c->start-d->start;       else return strcmp(c->word,d->word);}inline int ABS(int a){       if(a>0) return a;       else return -a;}int check()//返回起点{       int cnt1=0,cnt2=0,source;       for(int i=0;i<26;i++)       {              if(ABS(degree_in[i]-degree_out[i])==2)                     return -1;              else if(degree_in[i]-degree_out[i]==1)                     cnt1++;              else if(degree_in[i]-degree_out[i]==-1)              {                     cnt2++;                     source=i;              }       }       if(cnt1>1||cnt2>1)              return -1;       else if(cnt1==0)       {              for(int i=0;i<26;i++)                     if(degree_out[i])                            return i;       }       else return source;}bool solve_dfs(int source,int cnt){       if(cnt==edge_num) return true;       for(int i=0;i<edge_num;i++)       {              if(edges[i].start<source||used[i])                     continue;              else if(edges[i].start>source)                     return false;              used[i]=true;              edge_order[cnt]=i;              if(solve_dfs(edges[i].end,cnt+1)) return true;              used[i]=false;       }       return false;}int main(){       int t;       scanf("%d",&t);       while(t--)       {              memset(degree_out,0,sizeof(degree_out));              memset(degree_in,0,sizeof(degree_in));              scanf("%d",&edge_num);              for(int i=0;i<edge_num;i++)              {                     scanf("%s",edges[i].word);                     edges[i].start=edges[i].word[0]-'a';                     edges[i].end=edges[i].word[strlen(edges[i].word)-1]-'a';                     degree_out[edges[i].start]++;                     degree_in[edges[i].end]++;              }              int source=check();              if(source==-1)              {                     printf("***/n");                     continue;              }              qsort(edges,edge_num,sizeof(edges[0]),CMP);              memset(used,0,sizeof(used));              if(!solve_dfs(source,0))              {                     printf("***/n");                     continue;              }              printf("%s",edges[edge_order[0]].word);              for(int i=1;i<edge_num;i++)              {                     printf(".%s",edges[edge_order[i]].word);              }              printf("/n");       }}


原创粉丝点击