这个题目很经典,有两个点,一个是地址给出来怎么连接到一起,另一个是每k个数翻转
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int w[maxn], nt[maxn],f[maxn];
int s, n, k, x, cnt;
int main()
{
scanf("%d%d%d", &s, &n, &k);
for (int i = 0; i < n; i++) { scanf("%d", &x); scanf("%d%d", &w[x], &nt[x]); }//地址的值读入w[x]中,下一个地址读入nt[x]
for (int i = s; i != -1; i = nt[i])f[cnt++] = i;//这个很常用,在地址这边(儿子的儿子的儿子)
for(int i=0;i+k<=cnt;i+=k) //每k个里面
for (int j = 0; j < k; j++)//这个画一下就知道了,头一个和最后一个交换
{
if (i + j > i + k - j - 1)break;
else swap(f[i + j], f[i + k - j - 1]);
}
for (int i = 0; i < cnt; i++)
{
if (i < cnt - 1)printf("%05d %d %05d\n", f[i], w[f[i]], f[i + 1]);
else printf("%05d %d -1\n", f[i], w[f[i]]);
}
return 0;
}