JOJ 1068: Cipher 解题报告

    技术2022-05-11  4

    题意 :

     

    给定一个置换,求字符串n次置换的结果。

     

    分析 :

     

    1.   求出每个字母的转换周期。

     

    2.   对每个字母,多少次变换先把周期MOD掉,剪少计算量。

     

    3.   block 与 block 之间打一个空行,PE一次

     

    代码 :

     

    #include <iostream> using namespace std; int change[201]; int cycle[201]; char str[205]; char str1[205]; int times; void changeto(int t); int main() { int changenum; while(cin>>changenum,changenum) { int nowchangenum; for(nowchangenum=1;nowchangenum<=changenum;++nowchangenum) { cin>>change[nowchangenum]; } for(int i=1;i<=changenum;++i) { int cnt=0; int pos=i; do { ++cnt; pos=change[pos]; }while(pos!=i); cycle[i]=cnt; } while(cin>>times,times) { getchar(); str[0]='0'; scanf("%[^'/n']",&str[1]); int len=strlen(str); for(int i=len;i<=changenum;++i) { str[i]=' '; } str[changenum+1]='/0'; int t=1; char ch; ch=str[1]; strcpy(str1,str); for(int i=1;i<=changenum;++i) { changeto(i); } printf("%s/n",&str1[1]); } cout<<endl; } } void changeto(int t) { int t_st=t; int modvalue=times%cycle[t]; for(int i=1;i<=modvalue;++i) { t=change[t]; } //知道要变换到几, str1[t]=str[t_st]; } //保留那个字符


    最新回复(0)