题目链接:
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; }