题目大意: 给定n并且给出n个数字a1,a2,a3.....an,按照顺序第一位的数字放到第a1
的位置上,如此排列n位之后,算是置换一次。
给定m,则要求后面的字符串按照这个规则置换次,得出置换m次后的
字符串,并且最后输出一个换行符。
思路:刚开始总是runtime error 之后发现是最后输出的0 的情况么有搞清楚,导致
总是运行出错。这道题,最重要的用到了一个循环节的知识,一开始我记录的
字符串的循环节,按照顺序记录一个循环,之后发现这样可能存不下,而且很
可能超时。之后别人推荐可以将每个字符的循环节存储起来,以便于后续的运
用。相比之下,这样要快捷方便许多。
代码如下:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int a[250],n,b[250];
char data[250],index[250];
int get(int i,int sign) //得到循环节以及查找
{
int temp=a[i],l=1;
if(sign==-1)
{
while(temp!=i)
{
temp=a[temp];
l++;
}
return l;
}
else
{
while(l!=sign)
{
temp=a[temp];
l++;
}
return temp;
}
}
int main()
{
int i,k,temp,len;
while(scanf("%d",&n)!=EOF&&n)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
a[i]--;
}
for(i=0;i<n;i++) //存储循环节
b[i]=get(i,-1);
while(scanf("%d",&k)!=EOF&&k)
{
getchar();
gets(data);
len=strlen(data);
memset(index,32,sizeof(index));
for(i=0;i<n;i++)
{
if(len<=i)
data[i]=' '; //注意给字符串补全空格否则出现结果丢失
if(k%b[i]==0)
temp=i;
else
temp=get(i,k%b[i]);
index[temp]=data[i];
}
index[n]=0;
puts(index);
}
cout<< endl; //格式
}
return 0;
}