CCF-GESP计算机学会等级考试2026年6月二级C++T2 菱形

CCF-GESP计算机学会等级考试2026年6月二级C++T2 菱形

B4554 [GESP202606 二级] 菱形

题目描述

给定正整数nnn,在(2n−1)×(2n−1)(2n - 1) \times (2n - 1)(2n1)×(2n1)个网格的画布中,使用字符画一个边长为nnn个网格的菱形。其中,空白网格使用⋅\cdot表示,菱形边所在的网格用+++表示。

例如当n=3n = 3n=3时,图形如下:

..+.. .+.+. +...+ .+.+. ..+..

输入格式

输入一个正整数nnn

输出格式

输出2n−12n - 12n1行,表示按要求画的菱形。

输入输出样例 #1

输入 #1

4

输出 #1

...+... ..+.+.. .+...+. +.....+ .+...+. ..+.+.. ...+...

说明/提示

数据范围

3≤n≤153 \le n \le 153n15

解析

这道题跟去年(25年)9月份的题几乎是一样的。

解法一,矩阵中左上到右下的斜线,行和列的差相等,右上到左下的斜线,行和列的和相等。判断是否位于四条斜线上,是就打印+,不是就打印’.',详见代码:

#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m;cin>>n;n=n*2-1;m=n/2+1;for(inti=1;i<=n;i++){for(intj=1;j<=n;j++){if(i+j==m+1||i-j==m-1||j-i==m-1||i+j==m*3-1){cout<<'+';}else{cout<<'.';}}cout<<endl;}return0;}

解法二,做一个二维的字符数组,在数组中依次把四条线写进去,然后打印整个数组,详见代码:

#include<bits/stdc++.h>usingnamespacestd;chara[105][105];intn;intmain(){cin>>n;n=n*2-1;for(intj=n/2+1,i=1;j>=1;j--,i++){a[i][j]='+';}for(intj=n/2+1,i=1;j<=n;j++,i++){a[i][j]='+';}for(inti=n/2+1,j=1;i<=n;j++,i++){a[i][j]='+';}for(inti=n/2+1,j=n;i<=n;j--,i++){a[i][j]='+';}for(inti=1;i<=n;i++){for(intj=1;j<=n;j++){if(a[i][j]==0){cout<<'.';}else{cout<<a[i][j];}}cout<<endl;}return0;}