[欧拉回路]无序字母对

无序字母对的题目链接

思考:
为什么路径要倒着存放;
欧拉回路中的奇度顶点必须是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;
}

猜你喜欢

转载自blog.csdn.net/qq_44833767/article/details/104094174
今日推荐