poj1026

来源:互联网 发布:买房子哪个网好 知乎 编辑:程序博客网 时间:2024/05/01 02:07

题目大意: 给定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;}


0 0
原创粉丝点击