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

目录

题目描述

输入格式

输出格式

题目解析

完整代码


题目描述

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

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

对方同时也需要在电脑dos窗口中以字符的形式输出该标志,并能任意控制层数。
提示
请仔细观察样例,尤其要注意句点的数量和输出位置。 

输入格式

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

输出格式

对应包围层数的该标志。

样例输入

3

样例输出

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

题目解析

第一步:初始化(全为’.’)

int r = 5+n*4;  //总共r行r列,5是中间的十字,加上左边2n,右边2n
for(int i=1;i<=r;i++){
    for(int j=1;j<=r;j++){
        t[i][j]='.';
    }
}

 第二步:画中间的十字(左上角1/4)

for(int i=r/2+1-2;i<=r/2+1;i++){ //中间的十字 ,最中间的坐标为(r/2+1,r/2+1)
    t[r/2+1][i]='$';
    t[i][r/2+1]='$';
}

 第三步:【关键】画n层绕圈(左上角1/4)

void quater(int r,int c,int w){
    t[r][c]='$';
    for(int i=1;i<=w;i++){ //向上走 w 
        t[--r][c]='$';
    }
    for(int i=1;i<=2;i++){  //向右走 2
        t[r][++c]='$';
    }
    for(int i=1;i<=2;i++){  //向上走 2
        t[--r][c]='$';
    }
    for(int i=1;i<=w;i++){  //向右走w 
        t[r][++c]='$';
    }    
} 
{    ...
    int row = r/2+1;
    int col = r/2+1-4;
    int walk=2;
    while(n--){  //左上角四分之一,每个n为一层 ,起点为(row,col) 
        quater(row,col,walk); 
        col-=2;
        walk+=2;
    }
}

 

第四步:左右对称 

for(int j=r;j>r/2+1;j--) {
    for(int i=1;i<=r/2+1;i++){
        t[i][j] = t[i][r-j+1];
    }
}

 第五步:上下对称

for(int i=r;i>r/2+1;i--){
    for(int j=1;j<=r;j++){
        t[i][j] = t[r-i+1][j];
    }
}

完整代码

#include<cstdio>
#include<iostream> 
using namespace std;
char t[17][17];
void quater(int r,int c,int w){
    t[r][c]='$';
    for(int i=1;i<=w;i++){ //向上走 w 
        t[--r][c]='$';
    }
    for(int i=1;i<=2;i++){  //向右走 2
        t[r][++c]='$';
    }
    for(int i=1;i<=2;i++){  //向上走 2
        t[--r][c]='$';
    }
    for(int i=1;i<=w;i++){  //向右走w 
        t[r][++c]='$';
    }    
} 
int main(){
    int n;
    cin>>n;
    int r = 5+n*4;
    for(int i=1;i<=r;i++){
        for(int j=1;j<=r;j++){
            t[i][j]='.';
        }
    }
    for(int i=r/2+1-2;i<=r/2+1;i++){ //中间的十字 
        t[r/2+1][i]='$';
        t[i][r/2+1]='$';
    }
    int row = r/2+1;
    int col = r/2+1-4;
    int walk=2;
    while(n--){  //左上角四分之一,每个n为一层 ,起点为(row,col) 
        quater(row,col,walk); 
        col-=2;
        walk+=2;
    }
    //左右对称
    for(int j=r;j>r/2+1;j--) {
        for(int i=1;i<=r/2+1;i++){
            t[i][j] = t[i][r-j+1];
        }
    }
    //上下对称
    for(int i=r;i>r/2+1;i--){
        for(int j=1;j<=r;j++){
            t[i][j] = t[r-i+1][j];
        }
    } 
    for(int i=1;i<=r;i++){
        for(int j=1;j<=r;j++){
            cout<<t[i][j];
        }
        cout<<endl;
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

于建章

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

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

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

打赏作者

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

抵扣说明:

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

余额充值