poj1026

题目大意: 给定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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值