乱搞一发,,竟然过了!!!
题目大意:输入一个整数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; }