1.先将所有格子初始化为白格子;
2.由于图形是左右上下对称的图形,因此只要打印出左上角的图形,先进行左右对称,然后进行上下对称即可获得完整的形状。
3.将左上角部分分为A,B,C三个区域,先打印A区域,确定A区域上倾斜直线上的格子位置,由图可知,比较容易确定直线上的格子的横坐标,再根据直线方程y=x+2知道横纵坐标的关系;确定C区域只需将A区域的横纵坐标交换位置即可;确定B区域:从中心开始,依次打印。
PS:以后再遇到此类问题,可以先采用分割的方法,确定分割线的直线方程,然后再依次打印;
源码附上:
#include <iostream>
#include <cstring>
using namespace std;
char s[220][220];
int main()
{
int N;
cin >> N;
memset(s, '.', sizeof(s));
int length = N * 4 + 5;
int center = length / 2;
//打印边角区域(A,C)
for (int i = center - 2; i >= 0; i-=2)
{
for (int j = i + 2; j <= center; j++)
{
s[i][j] = '$';
s[j][i] = '$';
}
}
//打印B区域
for (int i = center; i >= 2; i -= 2)
{
for (int j = i; j >= i - 1; j--)
{
s[i][j] = '$';
s[j][i] = '$';
}
}
//左右对称
for (int i = 0; i <=center; i++)
{
for (int j = 0; j < center; j++)
{
s[i][length-1-j] = s[i][j];
}
}
//上下对称
for (int i = 0; i < center; i++)
{
for (int j = 0; j < length; j++)
{
s[length-1-i][j] = s[i][j];
}
}
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length; j++)
{
cout << s[i][j];
}
cout << endl;
}
return 0;
}