无序字母对

题目描述

给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。

输入输出格式

输入格式:

第一行输入一个正整数n。

以下n行每行两个字母,表示这两个字母需要相邻。

输出格式:

输出满足要求的字符串。

如果没有满足要求的字符串,请输出“No Solution”。

如果有多种方案,请输出前面的字母的ASCII编码尽可能小的(字典序最小)的方案

输入输出样例

输入样例#1: 
4
aZ
tZ
Xt
aX
输出样例#1: 
XaZtX 

说明

【数据规模与约定】

不同的无序字母对个数有限,n的规模可以通过计算得到。

分析:

本题只需要对每两个字母连一条无向边,然后跑一边欧拉回路即可,所以我又水了一道模板题???

CODE:

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 const int M=1005;
 8 int rd[M],n,g[M][M],tot;
 9 char re[3],pat[M];
10 int work(char c){
11     if (c>='A'&&c<='Z') return c-'A'+1;
12     return c-'a'+27;
13 }
14 char work2(int c){
15     if (c<=26) return c+'A'-1;
16     return c-27+'a';
17 }
18 void add(int x,int y){
19     rd[x]++,rd[y]++;
20     g[x][y]=g[y][x]=1;
21     return;
22 }
23 void dfs(int now){
24     for (int i=1;i<=52;i++){
25         if (!g[now][i]) continue;
26         g[now][i]=g[i][now]=0;dfs(i);
27     }
28     pat[++tot]=work2(now);
29     return;
30 }
31 int main(){
32     scanf("%d",&n);
33     for (int i=1;i<=n;i++){
34         scanf("%s",re+1);
35         add(work(re[1]),work(re[2]));
36     }
37     int now=0,fir=53;
38     for (int i=1;i<=52;i++)
39         if (rd[i]&1) now++,fir=min(fir,i);
40     if (now&&now-2){printf("No Solution");return 0;}
41     if (now) dfs(fir);
42     else {
43         for (int i=1;i<=52;i++) if (rd[i]) fir=min(fir,i);
44         dfs(fir);
45     }
46     for (int i=tot;i>=1;i--) putchar(pat[i]);
47     return 0;
48 }
原文地址:https://www.cnblogs.com/kanchuang/p/11185630.html