蓝桥杯-打印十字

原题链接

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

分析

  • 这个题,不知道考什么,感觉就是来磨时间的。
  • 主要先分析 ,看图,找规律
  • 输入的数字是n 5+4n即行数
  • 首先打印中间的十字,然后打印包围他的第一层,这一层首先把它当成一个类正方形(如下有示例图一),然后再把正方形的四个角修理一下即可(示例图二为最终结果)。
  • 我的代码就不用看了,贼难受,没想到什么好办法,而且不理清思路的话,你是看不懂代码的

先放截图

图一 刚开始是想打正方形的但是考虑到直接改变循环的大小,可以省一些步骤,所以我把上图,改成了下图:

图二:

后放代码

/**
这是网址

分析
主要先分析 ,看图,找规律

输入的数字是n 5+4n即层数

首先打印中间的十字,然后打印包围他的第一层,这一层首先把它当成一个正方形,然后再把正方形的四个角修理一下即可。

*/
#include <iostream>
#include <math.h>
using namespace std;

int main()
{
    int n;
    cin>>n;
    int k=5+4*n;//n表示围着的层数,k表示最终图形的行列数
    int **A=new int*[k];
    for(int i=0;i<k;i++){
        A[i]=new int[k];
    }
    A[2*n+2][2*n+2]=1;
    A[2*n+2][2*n+3]=1;
    A[2*n+2][2*n+4]=1;
    A[2*n+2][2*n+1]=1;
    A[2*n+2][2*n+0]=1;
    A[2*n+4][2*n+2]=1;
    A[2*n+3][2*n+2]=1;
    A[2*n+1][2*n+2]=1;
    A[2*n+0][2*n+2]=1;

    int c=(k-1)/2;
    for(int i=1;i<=n;i++){
            for(int j=c-2*i;j<=c+2*i;j++){
                A[j][c-2-2*i]=1;
                A[j][c+2+2*i]=1;
                A[c-2-2*i][j]=1;
                A[c+2+2*i][j]=1;
            }
            //修理四角
            //左上
            A[c-2*i][c-2*i]=1;
            A[c-2*i][c-1-2*i]=1;
            A[c-1-2*i][c-2*i]=1;
            //右上
            A[c-2*i][c+2*i]=1;
            A[c-2*i][c+1+2*i]=1;
            A[c-1-2*i][c+2*i]=1;

            //右下;
            A[c+2*i][c+2*i]=1;
            A[c+2*i][c+1+2*i]=1;
            A[c+1+2*i][c+2*i]=1;
            //左下
            A[c+2*i][c-2*i]=1;
            A[c+2*i][c-1-2*i]=1;
            A[c+1+2*i][c-2*i]=1;
    }

    for(int i=0;i<k;i++){
        for(int j=0;j<k;j++){
            if(A[i][j]==1){
                cout<<"$";
            }else{
                cout<<".";
            }
        }
        cout<<endl;
    }
}

原文地址:https://www.cnblogs.com/simuhunluo/p/8653347.html