C-Z型变换
时间: 1ms 内存:128M
描述:
让我们来玩个Z型变换的游戏,游戏的规则如下:给你一个字符串,将它以Z字型的形状不断伸展开,如给定字符串为"abcdefghijklmnopqrstuvwxyz",假设Z字形的宽度为4,那么我们展开为a g m s yb f h l n r t x zc e i k o q u wd 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;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。