http://poj.org/problem?id=1026
找到每个循环 并记录循环里有多少个数
对每个循环的字符进行移动 移动一次是一个循环 移动的次数 为循环里数的个数的余数
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<map> #include<cmath> #define LL long long using namespace std; const int N=205; int a[N]; int num[N]; char s[N]; void findnum(int n) { memset(num,-1,sizeof(num)); for(int i=0;i<n;++i) { if(num[i]==-1) { num[i]=1; int l=a[i]; while(l!=i) { num[l]=0; ++num[i]; l=a[l]; } } } } void encode(int k,int n) { for(int i=0;i<n;++i) { if(num[i]>0) { int w=k%num[i]; while(w--) { char ctemp=s[i]; int l=i; while(a[l]!=i) { char c=s[a[l]]; s[a[l]]=ctemp;//cout<<a[l]<<" "<<s[l]<<endl; l=a[l]; ctemp=c; }//cout<<l<<" "<<i<<endl; s[i]=ctemp; } } } } int main() { int n; while(scanf("%d",&n)!=EOF,n) { for(int i=0;i<n;++i) { scanf("%d",&a[i]); --a[i]; } findnum(n); int k; while(scanf("%d",&k),k) { getchar(); gets(s); for(int i=strlen(s);i<n;++i) { s[i]=' '; } s[n]='\0'; //puts(s); encode(k,n); for(int i=0;i<n;++i) { printf("%c",s[i]); } printf("\n"); } printf("\n"); } return 0; }