N型变换
问题
现给出一个字符串,根据给定的行数,将字符串以从上往下、从左到右进行N型(N的水平翻转)排列。
比如输入字符串为 “happyeveryday” 行数为 3 时,排列如下:
h ___ y ___ r ___ y
a _p _e _e _y _a
p ___ v ___ d
此时你需要将排列从左往右逐个读取,产生一个新的字符串,上述排列产生的字符串为“hyryapeeyapvd”。
思路
以5行为例,可以列出如下图序列,
输出序列为
(第一行)0 8 16 即 5-1 *2 = 8 ,的倍数
(第二行)1 7(8-1) 9(8+1) 15(16-1) 17(16+1)
…
(最后一行) 4 12(8+4) 20(16+4)最后一行只输出 + n-1 的,以防出现重复
代码
#include<iostream>
using namespace std;
int main()
{
string ss;
cin>>ss;
int len=ss.size(),n;
cin>>n;
int m=n-1;//将行数减一,方便之后计算
int bei=len/(m*2);
if(len%(2*m)>n) bei++;
for(int j=0;j<n;j++)
{
cout<<ss[j];
for(int i=1;i<=bei;i++)
{
if((i*2*m)-j<len && j!=m)
{
cout<<ss[(i*2*m)-j];
}
if(j!=0 && (i*2*m)+j<len)
{
cout<<ss[(i*2*m)+j];
}
}
}
return 0;
}