当前位置: 代码迷 >> 综合 >> JakeLin-[蓝桥杯][2013年第四届真题]打印十字图-题解
  详细解决方案

JakeLin-[蓝桥杯][2013年第四届真题]打印十字图-题解

热度:88   发布时间:2023-11-13 15:27:36.0

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

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

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

输入

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

输出

对应包围层数的该标志。

样例输入

3  

样例输出

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

原题链接:[蓝桥杯][2013年第四届真题]打印十字图

 

简单图形题,模拟过程分步解析:

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

int r = 5+n*4; //总共r行r列,5是中间的十字,加上左边2n,右边2nfor(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++){  //向右走 2t[r][++c]='$';}for(int i=1;i<=2;i++){  //向上走 2t[--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[150][150];
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++){  //向右走 2t[r][++c]='$';}for(int i=1;i<=2;i++){  //向上走 2t[--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;
}