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;
}
浙公网安备 33010602011771号