题目描述
输入样例
1
输出样例
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..
思路
纯模拟,可以有三种做法
模拟打印$
模拟打印.(本篇)
根据轴对称的性质,按照以上两种思路打印一半,然后另一半复制即可
AC代码
#include <iostream>
using namespace std;
const int N = 150;
char g[N][N];
int n, m;
void apex_angle()
{
//左上
g[0][0] = '.';
g[0][1] = '.';
g[1][0] = '.';
g[1][1] = '.';
//右上
g[0][m - 2] = '.';
g[0][m - 1] = '.';
g[1][m - 2] = '.';
g[1][m - 1] = '.';
//左下
g[m - 2][0] = '.';
g[m - 2][1] = '.';
g[m - 1][0] = '.';
g[m - 1][1] = '.';
//右下
g[m - 2][m - 2] = '.';
g[m - 2][m - 1] = '.';
g[m - 1][m - 2] = '.';
g[m - 1][m - 1] = '.';
}
void center()
{
//中心十字的中心坐标为(m / 2, m / 2)
//与其同一行的左边第一块空白区域坐标为y = m / 2 - 3, 左边第一块空白区域坐标为y = m / 2 + 3
int ly = m / 2 - 3;
int ry = m / 2 + 3;
int row = m / 2;
g[row][ly] = '.';
g[row][ry] = '.';
//基准行上面
for(int i = ly; i <= ly + 2; i ++) g[row - 1][i] = '.';
for(int i = ry; i >= ry - 2; i --) g[row - 1][i] = '.';
g[row - 2][ly + 2] = '.';
g[row - 2][ry - 2] = '.';
for(int i = ly + 2; i <= ly + 4; i ++) g[row - 3][i] = '.';
//基准行下面
for(int i = ly; i <= ly + 2; i ++) g[row + 1][i] = '.';
for(int i = ry; i >= ry - 2; i --) g[row + 1][i] = '.';
g[row + 2][ly + 2] = '.';
g[row + 2][ry - 2] = '.';
for(int i = ly + 2; i <= ly + 4; i ++) g[row + 3][i] = '.';
}
void others()
{
//从外向里
//定义该层的空白区域的四个边界
int l = 1, r = m - 2;
int u = 1, d = m - 2;
for(int i = 0; i < n - 1; i ++)
{
for(int i = u + 2; i <= d - 2; i ++) g[i][l] = '.'; //最左边
for(int i = u + 2; i <= d - 2; i ++) g[i][r] = '.'; //最右边
for(int i = l + 2; i <= r - 2; i ++) g[u][i] = '.'; //最上边
for(int i = l + 2; i <= r - 2; i ++) g[d][i] = '.'; //最下边
//四个拐角
//左上
g[u + 1][l + 2] = '.';
g[u + 2][l + 2] = '.';
g[u + 2][l + 1] = '.';
//左下
g[d - 1][l + 2] = '.';
g[d - 2][l + 2] = '.';
g[d - 2][l + 1] = '.';
//右上
g[u + 1][r - 2] = '.';
g[u + 2][r - 2] = '.';
g[u + 2][r - 1] = '.';
//右下
g[d - 1][r - 2] = '.';
g[d - 2][r - 2] = '.';
g[d - 2][r - 1] = '.';
//向里缩小
l += 2;
r -= 2;
u += 2;
d -= 2;
}
}
int main()
{
cin >> n;
m = 5 + 4 * n;
//将所有格子铺满$
for(int i = 0; i < m; i ++)
{
for(int j = 0; j < m; j ++)
g[i][j] = '$';
}
//扣除左上、右上、左下、右下四个区域的空白
apex_angle();
//扣除中心十字与第一层的区域
center();
//扣除层与层之间的空白区域
others();
for(int i = 0; i < m; i ++)
{
for(int j = 0; j < m; j ++)
cout << g[i][j];
cout << endl;
}
return 0;
}
欢迎大家批评指正!!!