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;
}

  

posted on 2012-07-25 11:51  夜->  阅读(184)  评论(0编辑  收藏  举报