您的位置:首页 > 其它

蓝桥杯-历届试题-打印十字图

2017-03-07 08:57 393 查看

问题描述

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

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


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

输入格式

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

输出格式

对应包围层数的该标志。

样例输入1

1

样例输出1

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


样例输入2

3

样例输出2

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


提示

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

以上为所给题目描述,——分割线——–以下为博主解题思路。

解题:

分析:

使用二维数组保存图形,并输出。

分析所给图案,可知该图为正方形,是中心对称图形,可将其分为四个部分。


可知知道其一部分,即可补全全图形。

考虑第一部分,由下图可见,黄线为其对称轴,该图形关于其对角线对称。



分析所给数字n与图形大小的关系,可知,正方形边长为4*n+5.

AC代码:

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
char data[126][126];    //二维数组,保存图形
int n;
while(cin>>n){
memset(data,'.',sizeof(data));//将数组置为‘.’,后续操作找出‘$’的位置。
int m=2*n+3; //找到中间线,即上图中红线的位置。
//考虑四分之一图案,对第一部分
for(int i=0;i<m;i++){   //行,从0开始
for(int j=i;j<m;j++){   //列
//考虑对角线上‘$’的位置,数组从0开始
if(i!=0 && i%2==0&&j==i){
//从所在对角线往上往左两个位置都为‘$’
data[i-2][j]=data[i-1][j]=data[i][j]='$';
data[i][j-2]=data[i][j-1]='$';
//外层边界,共有m-j个‘$’
for(int k=j;k<m;k++){
data[k][i-2]=data[i-2][k]='$';
}
}
}
}
//补全图形上半部分,(第2部分)
for(int i=0;i<m;i++)
for(int j=1;j<m;j++)
data[i][m+j-1]=data[i][m-j-1];
//补全图形全体,下半部分(第3,4部分)
for(int i=1;i<m;i++)
for(int j=0;j<4*n+5;j++)
data[m+i-1][j]=data[m-i-1][j];
//打印输出图形
for(int i=0;i<4*n+5;i++){
for(int j=0;j<4*n+5;j++)
cout<<data[i][j];
cout <<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  文字图形