字符串“PAYPALISHIRING”的一种“之”字型路线是这样的:
如果一行一行的读写,就是PAHNAPLSIIGYIR。
请写一个函数如下:string convert(string text, int nRows);
当输入convert("PAYPALISHIRING", 3)的时候,返回的结果是PAHNAPLSIIGYIR。
如果你还不了解,我告诉你,这就是一个字符串的转换问题,设置成之字形的路线。
zigzag conversion也就是按"N"字母的样子来重新安排字符串中字符的位置,并合并成一个新的字符串。nRows则表示"N"的高度,也就是每一竖列有nRows个字符。
输入格式:第一行输入一个长度不超过250的字符串text和一个整数nRows,中间空格间隔。
输出格式:输出一行字符串,表示最终结果。
样例输入
ABCDEFG 4
样例输出
AGBFCED
这道题,初一看是很难,仔细研究一下,找到其中的规律就不难写出答案,如图
可以看出,行数的变化是有规律的,如果高度为n,则每2n-2个字母行数为一组,另起一个数组来存相对应字符的行数,然后按行数打印出来即可,代码如下:
#include<iostream>
using namespace std;
void convert(string text, int nRows)
{
int a[300];
if(nRows == 1)
cout << text;
else
{
int n = text.length();
for(int i = 0;i < n; i++)
{
a[i] = (i + 1) % (2 * nRows - 2);
if(!a[i]) a[i] = 2 * nRows - 2;
if(a[i] > nRows)
{
int c = a[i] - nRows;
a[i] = nRows - c;
}
}
int hang = 0;
while(hang++ <= nRows)
{
for(int i = 0;i < n; i++)
{
if(a[i] == hang)
cout << text[i];
}
}
}
}
int main()
{
string text;
int nRows;
cin >> text >> nRows;
convert(text,nRows);
return 0;
}