• Codeforces Round #601 (Div. 2) C League of Leesins


    把每一次输入的一组数字存下来,然后把每个数字出现的组数存下来

    然后找只出现过一次的数字a,那么这个数字a不是开头就是结尾,默认为开头(是哪个都无所谓),然后去找和它出现在同一组的两个数字b和c,而b和c同时出现的只有两组,除了已经知道的,就是需要去查找的,然后循环,同时存在的组数,找到两个数字a和b同时出现的组而且不是第一组,找到之后的组的第三个数字,就是要接在后面的数字,然后循环这个操作

    #include <bits/stdc++.h>
    using namespace std;
    
    int ma[100010][5];//记录每组数据
    vector<int>p[100010];//记录数字i出现过的组数
    int ans[100010];//记录结果
    int main() {
        int n;
        scanf("%d",&n);
        for(int i=1; i<=n-2; i++) {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            p[a].push_back(i);
            p[b].push_back(i);
            p[c].push_back(i);
            ma[i][1]=a;
            ma[i][2]=b;
            ma[i][3]=c;
        }
        auto a=0,b=0,c=0;
        int last=0;//记录b和c出现过的组数
        for(int i=1; i<=n; i++) { //找开头的3个数(b和c的位置不重要)
            if(p[i].size()==1) {//如果出现的组数是1
                int temp=p[i][0];//记录出现的组数
                last=temp;//
                a=i;//记录第一个数字
                for(int j=1; j<=3; j++) {
                    if(p[ma[temp][j]].size()==2)b=ma[temp][j];
                    else if(p[ma[temp][j]].size()==3)c=ma[temp][j];
                }
            }
            if(a)break;
        }
        int cou=0;
        ans[++cou]=a;
        ans[++cou]=b;
        ans[++cou]=c;
        while(cou!=n) {
            int temp=0;//记录组数
            for(int i=0; i<p[b].size(); i++) { //找b和c相同的组数
                for(int j=0; j<p[c].size(); j++) {
                    // 同时出现在同一组      而且不是第一组
                    if(p[b][i]==p[c][j]&&p[b][i]!=last) {
                        temp=p[b][i];//更新组数
                        last=temp;//更新
                        a=b;//往前移
                        b=c;//往前移
                        break;
                    }
                }
                if(temp)break;//如果找到了,循环结束
            }
            for(int i=1; i<=3; i++) { //
                if(ma[temp][i]!=a&&ma[temp][i]!=b) { //如果成功出现的第三个数字
                    c=ma[temp][i];//第三个数字给c
                    break;//结束
                }
            }
            ans[++cou]=c;
        }
        for(int i=1; i<=n; i++) printf("%d ",ans[i]);
        return 0;
    }
  • 相关阅读:
    2020年7月3日 查找算法 代码
    QList 和QStringList为空 at()的错误
    网络编程TCP
    02#2位带操作
    04#认识指针
    03#指针内存图//拓展大小端序
    02#循环控制+分支控制+goto标签//拓展3目运算符和逗号运算符
    01#c语言基础内容
    输入的竖线变横
    Keil打包工程
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11937844.html
Copyright © 2020-2023  润新知