https://www.dotcpp.com/oj/problem1442.html
这种题对代码细节观察和处理还是很有帮助的,而且题目难度一般不大,可以拿来练手。
图形对称,规律好找的情况下先完成部分再拷贝,我的做法是先完成下半部分。
观察规律,除了中间一个十字比较特殊外,其余的都是大小比例不同的十字而已。
在这里定义四个变量,
left:十字最左端边界
right:十字最右端边界
middle:十字出现拐角时的行号
bottom:十字最下端边界
同时,外层十字的left、right和middle都比最近内层的大2,较外层middle是内层的bottom
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <queue>
#include <string>
#include <map>
#include <stack>
#define MAXN 130
#define MOD 1000000009
#define INF 0x7ffffff
#define lowbit(x) (x)&(-x)
using namespace std;
char edge[MAXN][MAXN];
int n;
inline void init(){
for(int i=0;i<MAXN;++i){
for(int j=0;j<MAXN;++j){
edge[i][j] = '.';
}
}
}
int main(){
while(cin >> n){
init();
int N = 4*n+5;
int m = N/2;
int left = m-2;
int right = m+2;
int middle = m;
int bottom = m+2;
for(int i=left;i<=right;++i){
edge[m][i] = '$';
}
for(int i=m;i<=bottom;++i){
edge[i][m] = '$';
}
while(n--){
left -= 2;
right += 2;
middle = bottom;
bottom += 2;
for(int i=m;i<middle;++i){
edge[i][left] = '$';
edge[i][right] = '$';
}
for(int i=left;i<=left+2;++i){
edge[middle][i] = '$';
}
for(int i=right-2;i<=right;++i){
edge[middle][i] = '$';
}
edge[middle+1][left+2] = edge[middle+1][right-2] = '$';
for(int i=left+2;i<=right-2;++i){
edge[bottom][i] = '$';
}
}
for(int i=0;i<m;++i){
memcpy(edge[i],edge[N-1-i],sizeof(edge[m+1+i]));
}
for(int i=0;i<N;++i){
for(int j=0;j<N;++j){
cout << edge[i][j];
}
cout << endl;
}
}
return 0;
}