正题
第三题:无序字母对
首先这题如何判No Solution相信大家都会,因为就是欧拉回路一笔画,有解当且仅当度为奇数的点有两个或没有。
大概就是这样吧,证明不怎么会。。。(我比较菜)。
否则就用矩阵记录一下有边的点,然后选出最小的点,遍历即可。
代码<邻接矩阵更简单哦~>
#include<cstdio>
#include<cstdlib>
#include<cstring>
int p[310][310];
int du[310];
char ans[90000];
int t=0;
int n;
void dfs(int x){
for(int i=0;i<=300;i++){
if(p[x][i]==1){
p[x][i]=p[i][x]=0;
dfs(i);
}
}
ans[t--]=x;
}
int main(){
scanf("%d",&n);
t=n;
for(int i=1;i<=n;i++){
char c[2];
scanf("%s",c);
p[c[0]][c[1]]=p[c[1]][c[0]]=1;
du[c[0]]++;du[c[1]]++;
}
int cnt=0,begin=0;
for(int i=0;i<=300;i++)
if(du[i]&1){
cnt++;
if(!begin) begin=i;
}
if(cnt && cnt!=2) {
printf("No Solution");
return 0;
}
if(!begin)
for(int i=0;i<=300;i++)
if(du[i]!=0) {begin=i;break;}
dfs(begin);
ans[n+1]='\0';
printf("%s",ans);
}