蓝桥杯2013年第四届真题——打印十字图

打印十字图


一、题目内容

问题描述
小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。

提示
请仔细观察样例,尤其要注意句点的数量和输出位置。 

输入

一个正整数  n  (n< 30)  表示要求打印图形的层数。  

输出

对应包围层数的该标志。

样例输入

3   

样例输出

..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$.. 

二、思路分析

 

         观察n=3的样例可以发现,图中间是固定十字,然后根据n的层数一层一层套圈,并且图形是上下左右对称的,只需要处理好图的1/4就好了,例如处理左上角1/4的方法:

void quater(int x, int y, int w) {  //画n层绕圈(左上角1/4)
	t[x][y] = '$';
	for (int i = 1; i <= w; i++) {  //向上走w
		t[--x][y] = '$';
	}
	for (int i = 1; i <= 2; i++) {  //向右走2
		t[x][++y] = '$';
	}
	for (int i = 1; i <= 2; i++) {  //向上走2
		t[--x][y] = '$';
	}
	for (int i = 1; i <= w; i++) {  //向右走w
		t[x][++y] = '$';
	}
}

         先将数组初始化为'.',然后画中间的十字,再画左上角1/4,再通过左右对称和上下对称画完其他的地方,最后输出。 


三、代码实现

#include <bits/stdc++.h>
using namespace std;

char t[200][200];

void quater(int x, int y, int w) {  //画n层绕圈(左上角1/4)
	t[x][y] = '$';
	for (int i = 1; i <= w; i++) {  //向上走w
		t[--x][y] = '$';
	}
	for (int i = 1; i <= 2; i++) {  //向右走2
		t[x][++y] = '$';
	}
	for (int i = 1; i <= 2; i++) {  //向上走2
		t[--x][y] = '$';
	}
	for (int i = 1; i <= w; i++) {  //向右走w
		t[x][++y] = '$';
	}
}

int main() {
	int n;
	cin >> n;
	int L = 5 + 4 * n; 
	for (int i = 1; i <= L; i++) {  //初始化(全为’.’)
		for (int j = 1; j < L; j++) {
			t[i][j] = '.';
		}
	}
	for (int i = L / 2 + 1 - 2; i <= L / 2 + 1; i++) {  //画中间的十字(左上角1/4)
		t[L / 2 + 1][i] = '$';
		t[i][L / 2 + 1] = '$';
	}
	int row = L / 2 + 1;
	int col = L / 2 + 1 - 4;
	int walk = 2;
	while (n--) {  //画左上角四分之一 ,起点为(row,col) 
		quater(row, col, walk);
		col -= 2;
		walk += 2;
	}
	//左右对称
	for (int j = L; j > L / 2 + 1; j--) {
		for (int i = 1; i <= L / 2 + 1; i++) {
			t[i][j] = t[i][L - j + 1];
		}
	}
	//上下对称
	for (int i = L; i > L / 2 + 1; i--) {
		for (int j = 1; j <= L; j++) {
			t[i][j] = t[L - i + 1][j];
		}
	}
    //输出
	for (int i = 1; i <= L; i++) {
		for (int j = 1; j <= L; j++) {
			cout << t[i][j];
		}
		cout << endl;
	}
	return 0;
}

加油哦! 如有错误和需要改进完善之处,欢迎大家纠正指教。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值