题目链接:
http://poj.org/problem?id=1026
http://acm.hdu.edu.cn/showproblem.php?pid=1439
题目大意:
给定一个 n 元置换 Key,输出一个字符串(长度若小于n则用空格补齐)经过 k 次置换后
的字符串
解题思路:
先求出 Key[i] 每个元素置换到自己本身的次数 ChangeNum[i],如 4 5 3 7 2 8 1 6 10 9
中,4->7->1->4 经过三次到循环,5->2->5 经过两次到循环,7->1->4->7 经过三次
到循环。再将字符串补全,进行 k % ChangeNum[i] 次置换。
AC代码:
# include "stdio.h"
# include "string.h"
int Key[210], ChangeNum[210];
char Ch[210], AnsCh[210];
int main()
{
int n, k;
while(~scanf("%d",&n) && n!=0)
{
memset(Key,0,sizeof(Key));
memset(ChangeNum,0,sizeof(ChangeNum));
for(int i = 1; i <= n; i++)
scanf("%d",&Key[i]);
for(int i = 1; i <= n; i++)
{
int num = 1;
int t = Key[Key[i]];
while(t!=Key[i])
{
num++;
t = Key[t];
}
ChangeNum[i] = num;
}
while(scanf("%d",&k) && k!=0)
{
getchar();
memset(Ch,0,sizeof(Ch));
memset(AnsCh,0,sizeof(AnsCh));
gets(Ch+1);
int len = strlen(Ch+1);
for(int i = len+1; i <= n; i++)
{
Ch[i] = ' ';
}
Ch[n+1] = '\0';
for(int i = 1; i <= n; i++)
{
int pos = i;
for(int j = 0; j < k % ChangeNum[i]; j++)
{
pos = Key[pos];
}
AnsCh[pos] = Ch[i];
}
AnsCh[n+1] = '\0';
puts(AnsCh+1);
}
printf("\n");
}
return 0;
}