解题思路
每层框框所占的画布大小为一个正方形,将每层框框所占的正方形的最左上角作为一个基准坐标点,再想出每层框框的线条的相关公式。
就能通过循环,从内到外依次找到每层框框的基准点,然后画出每层框框。
C++ 代码
#include <iostream>
using namespace std;
char g[150][150]; //设置画布大小
int main()
{
int n;
cin >> n;
for(int i=1;i<=4*n+5;i++)
for(int j=1;j<=4*n+5;j++)
g[i][j]='.'; //初始化画布
g[3+2*n][3+2*n]='$'; //先将中心的红十字画上
g[3+2*n][3+2*n-1]='$';
g[3+2*n][3+2*n-2]='$';
g[3+2*n][3+2*n+1]='$';
g[3+2*n][3+2*n+2]='$';
g[3+2*n-1][3+2*n]='$';
g[3+2*n-2][3+2*n]='$';
g[3+2*n+1][3+2*n]='$';
g[3+2*n+2][3+2*n]='$';
for(int i=1;i<=n;i++) //开始循环由内到外画每一层框框
{
int x=3+2*n-2-2*i,y=3+2*n-2-2*i; //找到该层的基准坐标
for(int j=y+2;j<=y+2+4*i;j++) //利用公式从上到下开始画框框
g[x][j]='$'; //画第一行
g[x+1][y+2]=g[x+1][y+2+4*i]='$'; //由此开始画第二行
g[x+2][y]='$';
g[x+2][y+1]='$';
g[x+2][y+2]='$';
g[x+2][y+2+4*i]='$';
g[x+2][y+3+4*i]='$';
g[x+2][y+4+4*i]='$';
for(int j=x+3;j<=x+2+4*i-1;j++)
g[j][y]=g[j][y+3+1+4*i]='$'; //用公式画两侧的竖线
g[x+2+4*i][y]='$'; //由此将上面的操作反过来画最后两行
g[x+2+4*i][y+1]='$';
g[x+2+4*i][y+2]='$';
g[x+2+4*i][y+2+4*i]='$';
g[x+2+4*i][y+3+4*i]='$';
g[x+2+4*i][y+4+4*i]='$';
g[x+2+4*i+1][y+2]=g[x+2+4*i+1][y+2+4*i]='$';
for(int j=y+2;j<=y+2+4*i;j++)
g[x+2+4*i+2][j]='$';
}
for(int i=1;i<=4*n+5;i++)
{
for(int j=1;j<=4*n+5;j++)
cout << g[i][j]; //输出画布
cout << endl;
}
}
就喜欢你这样思路简单了 还是太菜了大佬!!!