1762. 牛的洗牌
农夫约翰坚信快乐的奶牛会产出更多的牛奶,因此他在谷仓中安装了一个巨大的迪斯科球,并计划教他的奶牛跳舞!
在查阅了一些牛的流行舞蹈后,约翰决定教他的奶牛“洗牌舞”。
洗牌舞是由他的 N 只奶牛按一定顺序排成一行,然后连续执行三次“洗牌”,每次“洗牌”都可能会使奶牛重新排序。
为了让奶牛们更容易找到自己所处的位置,约翰用数字 1∼N 对一行中奶牛所在的位置进行了标记,一行中第一头奶牛处于位置 1,第二头奶牛处于位置 2,以此类推,直到位置 N。
每次“洗牌”用 N 个数字 a1,a2,…,aN 来描述,处于位置 i 的奶牛在一次“洗牌”过后,需要移动至位置 ai(因此,每个 ai 在 1…N 范围内)。
幸运的是,所有 ai 都是互不相同的,因此,不会存在多头奶牛在洗牌结束后移动到同一个位置的情况。
约翰的每头奶牛都有一个属于自己的唯一 7 位整数 ID (不含前导 0)。
给定你三轮“洗牌”过后的奶牛排列顺序,请你求出奶牛们的初始排列顺序。
输入格式
第一行包含整数 N。
第二行包含 N 个整数,表示 a1,a2,…,aN。
第三行包含了 N 头奶牛三轮“洗牌”过后的排列顺序,每头奶牛都用其 ID 指代。
输出格式
共 N 行,按照 N 头奶牛的初始排列顺序,每行输出一头奶牛的 ID。
数据范围
1≤N≤100,
1≤ai≤N
输入样例:
5
1 3 4 5 2
1234567 2222222 3333333 4444444 5555555
输出样例:
1234567
5555555
2222222
3333333
4444444
代码:
//置换
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n;
int a[N], id[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
for (int i = 1; i <= n; i++)
cin >> id[i];
for (int k = 0; k < 3; k++)
{
int p[N];
for (int i = 1; i <= n; i++)
p[i] = id[a[i]];
memcpy(id, p, sizeof id);
}
for (int i = 1; i <= n; i++)
cout << id[i] << endl;
return 0;
}