题目链接:
PREV-2 打印十字图
思路:
我们注意到我们只需要求出整张图的1/4个矩形,即可通过对称求出整张图;
以整张图的中心为坐标原点, 我们以右上角的1/4矩形为例,层数i
从0
开始一直到n
,第i
层的轨迹就是从
开始往右打印
个$
,然后依次往下、往下、往右打印三个$
,然后往右挪一格,从该格开始往下打印2 * i + 1
个$
;
将每层打印好,然后按对称的规律输出即可;
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
bool c[100][100];
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
cin >> n;
for(int i = 0; i <= n; i++) {
int x = -1, y = 2 * i + 2, cnt = 2 * i + 1;
for(int j = 0; j < cnt; j++) c[++x][y] = 1;
c[x][--y] = 1; c[x][--y] = 1; c[++x][y] = 1; ++x;
for(int j = 0; j < cnt; j++) c[x][y--] = 1;
}
int d = 2 * n + 3;
vector<string> v;
for(int i = d - 1; i >= 0; i--) {
string s = "";
for(int j = d - 1; j >= 0; j--) s += c[j][i] ? '$' : '.';
for(int j = 1; j <= d - 1; j++) s += c[j][i] ? '$' : '.';
cout << s << '\n';
v.push_back(s);
}
for(int i = d - 2; i >= 0; i--) cout << v[i] << '\n';
return 0;
}