我的代码:
思路就是把每一行看成一个字符串,然后逐渐增加字符就行
#include <iostream>
#include <vector>
using namespace std;
int main()
{
string s;
int n;
cin >> n; //读入行数
cin >> s; //读入字符串
vector<string>arr(n); //定义string类数组
if (n == 1) //发现只弄成1行,则直接原样输出就行
{
cout << s << endl;;
return 0;
}
int now = 0; //现在所在行
int dx = 1; //行偏移量
for (int i = 0; i < s.size(); i++)
{
arr[now] += s[i]; //将该行字符串加上字符
now += dx; //挪动所在行
if (now == 0 || now == n-1) dx = -dx; //如果到第一行或最后一行,行偏移要取反
}
for (int i = 0; i < n; i++)
cout << arr[i];
return 0;
}
以前写的题解(不是很好)
#include <iostream>
#include <vector> //为了使用vector容器
using namespace std;
int main()
{
int n; //多少行
string s; //要输入的字符串
cin >> n;
cin >> s;
vector<vector<char>>arr(n, vector<char>(1005)); //用vector容器弄二维数组,n行,列数先填大些,后续会判断到底多少列,默认数组里的量全是0
int x = 0; //arr数组的横坐标
int y = 0; //arr数组的纵坐标
int k = 0; //用来对字符串s进行索引
int list_num = 0; //定义arr数组的实际列数
if(n==1) //特殊判断
{
cout<<s;
return 0;
}
while (1) //不知道循环几次就死循环,到时候跳过
{
int flag = 1; //1代表还没终止(还没到字符串最后)
for (int i = 0; i < n && flag == 1; i++) //往下走,只要没终止就一直把字符串s的量填到arr数组中
{ //因为有n行,所以循环n次
arr[x++][y] = s[k++]; //沿着路径往下走,注意是后自增(画图,手写坐标就明白了)
if (k == s.size()) //当k==字符串s的大小,则表示字符串的量全填进arr数组中了
{
flag = 0; //0代表终止了,到字符串最后了
break; //跳出for循环
}
}
list_num++; //沿着路径一直往下走的走完了,让实际列数list_num加1
x = x - 2; //若n为4,则这里时,x为4,-2后,x变为2,,这么是为了下面的后自增(画图,自己手写坐标就知道了)
y = y + 1; //若n为4,则这里时,y为0.+1后,y=1,这么是为了下面的后自增(画图,自己手写坐标就知道了)
for (int i = 0; i < n - 2 && flag == 1; i++)//该斜着走,循环次数是n-2次,只要没终止就一直把字符串s的量填到arr数组中
{
list_num++; //因为斜着走,实际列数必定每次循环都会加1
arr[x--][y++] = s[k++]; //沿着路径该斜着走了,注意是后自增(画图,手写坐标就明白了)
if (k == s.size())
{
flag = 0;
break;
}
}
if (flag == 0) break; //当终止了(即到字符串最后了)结束while死循环
}
for (int i = 0; i < n; i++) //开始输出arr数组中的数,就按正常输出2维数组那样输出
{
for (int j = 0; j < list_num; j++) //注意这里j是<list_num (跟实际有n行,i<n一个道理)
{
if (arr[i][j] == 0) continue; //当发现该坐标,数组中的数是0,则跳过(出现0跟当初定义vector容器时有关)
else cout << arr[i][j]; //否则就正常输出数组中正常的数
}
}
return 0;
}