C-Z型变换

C-Z型变换

时间: 1ms        内存:128M

描述:

让我们来玩个Z型变换的游戏,游戏的规则如下:
给你一个字符串,将它以Z字型的形状不断伸展开,
如给定字符串为"abcdefghijklmnopqrstuvwxyz",
假设Z字形的宽度为4,那么我们展开为
a        g        m        s        y
b     f  h     l  n     r   t     x  z
c  e     i  k     o  q     u  w
d         j         p         v
   
现在我们一行一行读出字母,空格均省略,则得到:
agmsybfhlnrtxzceikoquwdjpv
明白了吗?
那么问题来了:已知给定的字符串和Z字形的宽度,求展开后按行读取的字符串是什么。

输入:

多组数据输入,直到文件末。每行包含一个字符串s代表需要展开的字符串,一个正整数t,代表Z字形的宽度
字符串中只包含英文字母,长度<=100。

输出:

每组数据输出展开后按行读取组成的字符串。

示例输入:

PAYPALISHIRING 3

示例输出:

PAHNAPLSIIGYIR

提示:

参考答案(内存最优[1120]):

#include<stdio.h>
#include<string.h>
int main()
{
    char a[200];
     int t;
    while(scanf("%s %d",&a,&t)!=EOF)
    {
    int x=strlen(a);
    int k=t-1;
    int i,j;
    if(t==1)
        printf("%s",a);
    else
        {
    for(i=0;i<t;i++)
        {
          int s=k-i;
          if(s==0)
            s=k;
          printf("%c",a[i]);
          int j=i;
          while(j+2*s<x)
          {
              printf("%c",a[j+2*s]);
              j=j+2*s;
                if(s!=k)
                {
                    s=k-s;
                }

          }
        }
        }
        printf("\n");
    }
    return 0;
}

参考答案(时间最优[0]):

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

int main(){
    char a[110];
    int t,i,j,lent;
    while(~scanf("%s%d",a,&t)){
        if(t==1){printf("%s\n",a);continue;}
        lent=strlen(a);
        for(j=0;j<lent;j=j+2*t-2)printf("%c",a[j]);//第一行
        for(i=1;i<t-1;i++){//中间行
            for(j=i;j<lent;j=j+2*i){
                if(j<lent)printf("%c",a[j]);//第一个
                j=j+2*(t-i-1);
                if(j<lent)printf("%c",a[j]);//第二个
            }
        }
        for(j=t-1;j<lent;j=j+2*t-2)printf("%c",a[j]);//最后一行
        printf("\n");
    }
    return 0;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注