【第四届蓝桥杯】打印十字图

题目:打印十字图

    小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示(可参见p1.jpg)

                     $$$$$$$$$$$$$
                     $           $
                   $$$ $$$$$$$$$ $$$
                   $   $       $   $
                   $ $$$ $$$$$ $$$ $
                   $ $   $   $   $ $
                   $ $ $$$ $ $$$ $ $
                   $ $ $   $   $ $ $
                   $ $ $ $$$$$ $ $ $
                   $ $ $   $   $ $ $
                   $ $ $$$ $ $$$ $ $
                   $ $   $   $   $ $
                   $ $$$ $$$$$ $$$ $
                   $   $       $   $
                   $$$ $$$$$$$$$ $$$
                     $           $
                     $$$$$$$$$$$$$

p1.jpg

    对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
    为了能准确比对空白的数量,程序要求对行中的空白以句点(.)代替。
输入格式:
一个正整数 n (n<30) 表示要求打印图形的层数
输出:
对应包围层数的该标志。

例如:
用户输入:
1
程序应该输出:
..$$$$$..
..$...$..
$$$.$.$$$
$...$...$
$.$$$$$.$
$...$...$
$$$.$.$$$
..$...$..
..$$$$$..

再例如:
用户输入:
3
程序应该输出:
..$$$$$$$$$$$$$..
..$...........$..
$$$.$$$$$$$$$.$$$
$...$.......$...$
$.$$$.$$$$$.$$$.$
$.$...$...$...$.$
$.$.$$$.$.$$$.$.$
$.$.$...$...$.$.$
$.$.$.$$$$$.$.$.$
$.$.$...$...$.$.$
$.$.$$$.$.$$$.$.$
$.$...$...$...$.$
$.$$$.$$$$$.$$$.$
$...$.......$...$
$$$.$$$$$$$$$.$$$
..$...........$..
..$$$$$$$$$$$$$..

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

资源约定:
峰值内存消耗 < 64M
CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件
提交时,注意选择所期望的编译器类型。

代码一:

#include <iostream>
using namespace std;
#define N 5+30*4+1
int main() {
	int n, i, j, k; 
	int v[N][N] = {0};//1代表'$',0代表'.' 
	cin >> n;
	int size = (5+n*4)/2;//十字图的行列相等,用一个size代表行列即可 
	//十字图是一个中心对称的图形,可分为四部分
	//只要已知一个部分的布局即可翻转得出其他三部分 
	for(i = 1; i <= size; i++)
		if(i%2)//先将奇数行i+2列后的数都标志为1 
			for(j = i+2; j <= size+1; j++)
				v[i][j] = 1;
	for(i = 3; i <= size; i++)
		for(j = 1; j <= size; j++) 
			if(i%2)//从i行等于j列的位置延伸去赋值 
				if(i == j){
					v[i][j] = 1;//i行等于j列的位置应为1 
					v[i][j-1] = 1;//左边也为1 
					v[i-1][j] = 1;//上边也为1 
					v[i][j-2] = 1;//左二也为1 
					for(int k = i; k <= size+1; k++) 
						v[k][j-2] = 1;//左二至下都为1 
				}	
	//正中间的十字图形是固定的,可单独赋值为1 
	v[size+1][size+1] = v[size][size+1] = v[size+1][size] = v[size+1][size-1] = 1;
	//翻转第一部分按要求复制其他三个部分 
	for(int a = 1, b = size*2+1; a <= size+1; a++, b--) {	
		int k = 1;
		for(j = size*2+1; j >= size+2; j--) {
			v[a][j] = v[j][a] = v[b][j] = v[a][k++];
		}
	} 
	//输出结果 
	for(i = 1; i <= size*2+1; i++){	
		for(j = 1; j <= size*2+1; j++){
			if(v[i][j])
				cout << '$';
			else
				cout << '.';
		}
		cout << endl;
	}
	
	
	return 0;
}

代码二(优化)

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
	int n, a[130][130] = {0};//1代表'$',0代表'.' 
	cin >> n; 
	int len = (n*4+5)/2; //十字图的行列相等,用len代表行列即可
	int i, j, r, k;
	//十字图是一个中心对称的图形,可分为四部分
	//只要已知一个部分的布局即可翻转得出其他三部分 
	for(i = 1; i <= len+1; i += 2)
		for(j = i+2; j <= len+1; j++)
				a[i][j] = 1; 
	//从3以上与奇数行相等的奇数列才有的规律 
	for(i = 3; i <= len+1; i += 2) {
		//i行等于j列的位置应为1,该位置的左边和上边也为1 
		a[i][i] = a[i-1][i] = a[i][i-1] = 1;
		for(j = i; j <= len+1; j++)
			a[j][i-2] = 1;//左二至下都为1 
	}
	//翻转第一部分按要求复制其他三个部分
	for(i = 1, r = len*2+1; i <= len+1; i++, r--) {
		k = 1;
		for(j = len*2+1; j >= len; j--)
			a[i][j] = a[j][i] = a[r][j] = a[i][k++];
	}
	for(i = 1; i <= len*2+1; i++) { //输出结果 
		for(j = 1; j <= len*2+1; j++) {
			if(a[i][j])
				cout << '$';
			else
				cout << '.';
		}	
		cout << endl;
	}
	return 0;
}

第四届蓝桥杯所有组试题与部分答案

  
  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Homilier

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值