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;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11937844.html