把每一次输入的一组数字存下来,然后把每个数字出现的组数存下来
然后找只出现过一次的数字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; }