打印十字图[蓝桥杯]

题目描述

题目传送门
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

输入样例
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; 
} 

欢迎大家批评指正!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值