给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现。
输入样例#1:
4 aZ tZ Xt aX
输出样例#1:
XaZtX
1 #include<bits/stdc++.h> 2 #define maxn 999 3 using namespace std; 4 5 int du[maxn]; 6 int book[maxn][maxn]; 7 stack<int> s; 8 int n; 9 int number[maxn]; 10 int ans[20000]; 11 void dfs(int k,int num) 12 { 13 ans[num]=k; 14 if(num==n+1) 15 { 16 for(int i=1;i<=n+1;i++) 17 cout<<char(ans[i]+'A'); 18 exit(0); 19 } 20 for(int i=0;i<65;i++)//保证了字典序 21 if(book[i][k]) 22 { 23 book[i][k]=book[k][i]=0; 24 dfs(i,num+1); 25 book[i][k]=book[k][i]=1; 26 27 } 28 return ; 29 30 } 31 32 33 int main() 34 { 35 cin>>n; 36 char str[2];int A,B; 37 for(int i=0;i<n;i++) 38 { 39 scanf("%s",str); 40 A=str[0]-'A'; 41 B=str[1]-'A'; 42 du[A]++; 43 du[B]++; 44 book[A][B]=book[B][A]=1; 45 } 46 int sum=0; 47 for(int i=0;i<65;i++) 48 if(du[i]%2) 49 number[sum++]=i; 50 if(sum==1||sum>2) printf("No Solution\n"); 51 else 52 { 53 if(sum==2) 54 { 55 if(number[0]<number[1]) 56 57 dfs(number[0],1); 58 else 59 dfs(number[1],1); 60 }//二个奇点的情况 61 else 62 { 63 for(int i=0;i<65;i++) 64 if(du[i]) 65 { 66 dfs(i,1); 67 break; 68 } 69 } 70 71 } 72 return 0; 73 }
1 #include<bits/stdc++.h> 2 #define maxn 999 3 using namespace std; 4 5 int du[maxn]; 6 int book[maxn][maxn]; 7 stack<int> s; 8 int n; 9 int number[maxn]; 10 11 void dfs(int k) 12 { 13 for(int i=0;i<70;i++)//保证了字典序 14 if(book[i][k]) 15 { 16 book[i][k]=book[k][i]=0; 17 dfs(i); 18 s.push(i);//因为是倒推,所以用堆来储存 19 } 20 21 } 22 23 24 int main() 25 { 26 cin>>n; 27 char str[2];int A,B; 28 for(int i=0;i<n;i++) 29 { 30 scanf("%s",str); 31 A=str[0]-'A'; 32 B=str[1]-'A'; 33 du[A]++; 34 du[B]++; 35 book[A][B]=book[B][A]=1; 36 } 37 int sum=0; 38 for(int i=0;i<70;i++) 39 if(du[i]%2) 40 number[sum++]=i; 41 if(sum==1||sum>2) printf("No Solution\n"); 42 else 43 { 44 if(sum==2) 45 { 46 dfs(number[0]); 47 s.push(number[0]); 48 }//二个奇点的情况 49 else 50 { 51 for(int i=0;i<70;i++) 52 if(du[i]) 53 { 54 dfs(i); 55 s.push(i); 56 break; 57 } 58 } 59 60 while(!s.empty()) 61 { 62 cout<<char(s.top()+'A'); 63 s.pop(); 64 } 65 } 66 return 0; 67 }
两类dfs的代码~