C - League of Leesins

乱搞一发,,竟然过了!!!

题目大意:输入一个整数n,然后n-2行,每一行3个数字,表示一个数组中连续的3个数字,然后将这3个数字的顺序打乱,然后再将这个n-2行打乱,要求还原数组。

题解:先找到前3个数字,第一个数字跟最后一个数字出现的次数肯定为1,所以直接找出现次数为1的点就可以了。然后第二个点的出现次数肯定为2,第三个点的出现次数为3,然后根据第二个点和第三个点去找第四个点,,,用vector来记录位置。

#include<bits/stdc++.h>
using namespace std;
const int N=1E5+7;
int arrl[N],arrm[N],arrr[N];
int mark[N];
vector<int >ve[N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n-2;i++) {
        cin>>arrl[i]>>arrm[i]>>arrr[i];
        ve[arrl[i]].push_back(i);
        ve[arrm[i]].push_back(i);
        ve[arrr[i]].push_back(i);
    }
    int pos1,pos2,pos3;
    int x;
    for(int i=1;i<=n;i++) {
        if(ve[i].size()==1) {
            pos1=i;
            x=ve[i][0];
            if(ve[arrl[x]].size()==2) pos2=arrl[x];
            if(ve[arrr[x]].size()==2) pos2=arrr[x];
            if(ve[arrm[x]].size()==2) pos2=arrm[x];
            if(ve[arrl[x]].size()==3) pos3=arrl[x];
            if(ve[arrr[x]].size()==3) pos3=arrr[x];
            if(ve[arrm[x]].size()==3) pos3=arrm[x];
            break;
        }
    }
    int pos=3;
    cout<<pos1<<" "<<pos2<<" "<<pos3<<" ";
    while(1){
        if(pos>n) break;
        else {
             for(int i=0;i<ve[pos2].size();i++){
                if(ve[pos2][i]==x) continue ;
                for(int j=0;j<ve[pos3].size();j++){
                    if(ve[pos2][i]==ve[pos3][j]){
                        x=ve[pos2][i];
                        if(arrr[x]!=pos2&&arrr[x]!=pos3){
                            cout<<arrr[x]<<" ";
                            pos2=pos3;
                            pos3=arrr[x];
                        }
                        else if(arrl[x]!=pos2&&arrl[x]!=pos3){
                            cout<<arrl[x]<<" ";
                            pos2=pos3;
                            pos3=arrl[x];
                        }
                        else if(arrm[x]!=pos2&&arrm[x]!=pos3){
                            cout<<arrm[x]<<" ";
                            pos2=pos3;
                            pos3=arrm[x];
                        }
                    break;
                    }
                }
             }
        }
        pos++;
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Accepting/p/11971750.html
今日推荐