2898: C-Z型变换
时间限制: 1 Sec 内存限制: 128 MB提交: 53 解决: 15
题目描述
让我们来玩个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
你 离 开 了 , 我 的 世 界 里 只 剩 下 雨 。 。 。
#include <iostream> using namespace std; int main() { char s[100]; char out[100]; int n,i,len,j,temp,temp1,temp2,count; while(cin>>s,cin>>n) { count=0; len=0; temp=2*(n-1); while(s[len++]!=NULL); len--; if(n==1)cout<<s; else { for(i=0; i<n; i++) { if(i==0||i==n-1) { out[count++]=s[i]; for(j=temp; i+j<len; j+=temp) out[count++]=s[i+j]; } else { out[count++]=s[i]; temp1=temp-2*i; temp2=2*i; if(temp1==temp2) { for(j=temp1; i+j<len; j+=temp1) out[count++]=s[i+j]; } else { for(j=temp1; i+j<len; j+=temp) { out[count++]=s[i+j]; if(i+j+temp2<len) out[count++]=s[i+j+temp2]; } } } } for(i=0; i<len; i++) cout<<out[i]; } cout<<' '; } return 0; }