回形针,是一种回型的针。(废话
输入格式:
一行字符串,长度不超过1e4
输出格式:
将输入的字符串以螺旋状输出,使得输出呈现一个正方形(行数=每行字符数),要求该正方形在大小足以容纳该字符串的前提下尽可能小。若按指定方式填充后该正方形内有空缺,则空缺部分以空格填补。输出从左上角开始向右行进,遇到拐角即右转(示意图:回形针.png)。
输入样例:
This is a test case.
输出样例:
This
casei
.s
t
set a
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
const int N = 110;
bool vis[N][N];
char ans[N][N];
string s;
int main()
{
getline(cin, s);
int n = sqrt(s.size());
if(n * n < s.size()) {
n++;
}
for(int i = s.size(); i < n * n; i++) {
s += ' ';
}
for(int i = 0; i <= n; i++) {
vis[n][i] = 1;
vis[i][n] = 1;
}
int i = 0, j = 0, cnt = 0;
while(vis[i][j] == 0) {
while(vis[i][j] == 0) {
vis[i][j] = 1;
ans[i][j++] = s[cnt++];
}
j--;
i++;
while(vis[i][j] == 0) {
vis[i][j] = 1;
ans[i++][j] = s[cnt++];
}
j--;
i--;
while(vis[i][j] == 0 && j >= 0) {
vis[i][j] = 1;
ans[i][j--] = s[cnt++];
}
i--;
j++;
while(vis[i][j] == 0 && i >= 0) {
vis[i][j] = 1;
ans[i--][j] = s[cnt++];
}
i++;
j++;
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
cout << ans[i][j];
}
cout << endl;
}
return 0;
}