思考:
为什么路径要倒着存放;
欧拉回路中的奇度顶点必须是2个或者0个,才可以一笔画完;
#include <bits/stdc++.h>//差值是6;
using namespace std;
int mapp[100][100];
int flag[100];
int book[100];
int book2[100][100];
stack<int> q;
void dfs(int x)
{
for(int i=0;i<100;i++){
if(mapp[x][i]>0){
//q.push(x);
//q.push(i);
mapp[x][i]--;
mapp[i][x]--;
dfs(i);
//break;
}
}
book[x]=1;//必须倒着存路径,正着存放反而不对;
q.push(x);
return ;
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
string str;
cin>>str;
if(str[0]<'a'&&str[1]<'a'){
mapp[str[0]-'A'][str[1]-'A']++;
mapp[str[1]-'A'][str[0]-'A']++;
flag[str[1]-'A']++;
flag[str[0]-'A']++;
}
if(str[0]>='a'&&str[1]<'a'){
mapp[str[0]-6-'A'][str[1]-'A']++;
mapp[str[1]-'A'][str[0]-6-'A']++;
flag[str[1]-'A']++;
flag[str[0]-6-'A']++;
}
if(str[0]>='a'&&str[1]>='a'){
mapp[str[0]-6-'A'][str[1]-6-'A']++;
mapp[str[1]-6-'A'][str[0]-6-'A']++;
flag[str[1]-6-'A']++,
flag[str[0]-6-'A']++;
}
if(str[0]<'a'&&str[1]>='a'){
mapp[str[1]-6-'A'][str[0]-'A']++;
mapp[str[0]-'A'][str[1]-6-'A']++;
flag[str[0]-'A']++,
flag[str[1]-6-'A']++;
}
}
int minn=999;
queue<int> qq;
int nottrue=0;
for(int i=0;i<100;i++){
if(flag[i]%2==1){
qq.push(i);
}
}
if(qq.size()){
if(qq.size()!=2) return puts("No Solution"),0;
//cout<<"================";
while(!qq.empty()){
int fr=qq.front();
qq.pop();
minn=min(minn,fr);
}
//q.push(minn);
//book[minn]=1;
dfs(minn);
for(int i=0;i<100;i++){
if(book[i]==0&&flag[i]){
nottrue=1;
break;
}
}
if(nottrue) puts("No Solution");
else
while(!q.empty()){
int fr=q.top();
q.pop();
if(fr>=26)
printf("%c",fr+'A'+6);
else
printf("%c",fr+'A');
}
}
else{
//cout<<"Else"<<endl;
int minv=-1;
for(int i=0;i<100;i++){
if(flag[i]%2==0&&flag[i]){
minv=i;
break;
}
}
//q.push(minv);
//book[minv]=1;
dfs(minv);
for(int i=0;i<100;i++){
if(book[i]==0&&flag[i]){
nottrue=1;
break;
}
}
if(nottrue) puts("No Solution");
else
while(!q.empty()){
int fr=q.top();
q.pop();
if(fr>=26)
printf("%c",fr+'A'+6);
else
printf("%c",fr+'A');
}
}
return 0;
}
幼儿园的东东小盆友
发布了17 篇原创文章 · 获赞 4 · 访问量 1584
私信
关注