目录
Description
上大学了,小J学会了一种加密算法,这种算法可以根据一个行数 ,将一个字符串进行重新排列,变成无法读懂的密文。
例如:给定一个字符串 "",行数
,将其进行从上到下,从左到右的Z字形排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:""。
Format
Input
一个由英文字母及英文标点符号组成的字符串 及一个行数
(
≤
≤
),
的长度在
∼
之间。
Output
输出加密字符串
Samples
输入数据 1
PAYPALISHIRING 3
输出数据 1
PAHNAPLSIIGYIR
输入数据 2
PAYPALISHIRING 4
输出数据 2
PINALSIGYAHRP
Hint2
P I N
A L S I G
Y A H R
P I
输入数据 3
A 1
输出数据 3
A
输入数据 4
hello,world! 3
输出数据 4
horel,ol!lwd
Limitation
s,
KiB for each test case.
解法
刚上去的时候,我直接懵了
啥?!
要Z型???????(此处省略9不可思议(数字单位 想知道自己查)个?)
然鹅,我经过 几分钟的冥思苦想,我发现了一个神奇的规律
龟哥(扔袜子):要不要脸!
好啦好啦
比如说下面这张图(字符都用*代替了)
* *
* ** *
* * * *
* * * *
* * * *
* * * *
* * * *
** **
* *
你会发现
它更像型呢
* *
* * * *
* * * *
* * * *
* * * *
* * * *
* * * *
** **
* *
看出来了么有?
再把空格去掉
**
****
****
****
****
****
****
****
**
再来整理出一个周期
它长这个样儿
*
**
**
**
**
**
**
**
*
这样一来 原来的候选人(……)都淘汰了
只留下……
循环!
这样
不停遍历周期即可
不用暴力出奇迹,骗分过样例
注意:现实中会出现不完全周期,要小心
代码
#include<bits/stdc++.h>
using namespace std;
char p[1007];
string s[1007],o;
int l,n;
int main(){
scanf("%s %d",&p,&l);
while(n<strlen(p)){
for(int i=1;i<l;i++){
if(n==strlen(p)) break;
s[i]+=p[n];
n++;
}
if(n==strlen(p)) break;
for(int i=l;i>1;i--){
if(n==strlen(p)) break;
s[i]+=p[n];
n++;
}
}
for(int i=1;i<=l;i++){
o+=s[i];
}
cout<<o;
}