蓝桥杯-打印十字
原题链接
历届试题 打印十字图 小明为某机构设计了一个十字型的徽标(并非红十字会啊),如下所示:
分析
- 这个题,不知道考什么,感觉就是来磨时间的。
- 主要先分析 ,看图,找规律
- 输入的数字是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;
}
}