题意:给定一个 n 元置换 key,输入一个字符串(长度若小于 n 则用空格补齐),输出经过 k 次置换后的字符串。
方法:首先计算每个位置置换到自身的置换次数,即循环长度;然后用空格补齐字符串;最后用总置换次数对每个位置的循环长度取余,计算每个位置置换到的最终位置即可。
#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 205;
int key[MAXN], cycle[MAXN]; //置换数组,循环长度数组
char before[MAXN], after[MAXN]; //原字符串,置换后的字符串
int main()
{
int n;
while (cin >> n)
{
if (n == 0)
break;
memset(key, 0, sizeof(key));
memset(cycle, 0, sizeof(cycle));
for (int i = 1; i <= n; i++)
{
cin >> key[i];
}
for (int i = 1; i <= n; i++) //计算每个位置的循环长度
{
int num = 1;
int temp = key[key[i]];
while (temp != key[i])
{
++num;
temp = key[temp];
}
cycle[i] = num;
}
int k;
while (cin >> k)
{
if (k == 0)
break;
memset(before, 0, sizeof(before));
memset(after, 0, sizeof(after));
getchar(); //读取空格
cin.getline(before + 1, MAXN - 1);
int len = strlen(before + 1);
for (int i = len + 1; i <= n; i++) //补齐字符串
{
before[i] = ' ';
}
before[n + 1] = '\0';
for (int i = 1; i <= n; i++) //计算每个位置置换到的最终位置
{
int pos = i;
for (int j = 0; j < k % cycle[i]; j++)
{
pos = key[pos];
}
after[pos] = before[i];
}
after[n + 1] = '\0';
cout << after + 1 << endl;
}
cout << endl;
}
return 0;
}
继续加油。