CCF-GESP计算机学会等级考试2025年9月二级C++T2 菱形
B4412 [GESP202509 二级] 菱形
题目描述
小 A 想绘制一个菱形。具体来说,需要绘制的菱形是一个 nnn 行 nnn 列的字符画,nnn 是一个大于 111 的奇数。菱形的四个顶点依次位于第 111 行、第 111 列、第 nnn 行、第 nnn 列的正中间,使用 # 绘制。相邻顶点之间也用 # 连接。其余位置都是 .。
例如,一个 555 行 555 列的菱形字符画是这样的:
..#.. .#.#. #...# .#.#. ..#.. 给定 nnn,请你帮小 A 绘制对应的菱形。
输入格式
一行,一个正整数 nnn。
输出格式
输出共 nnn 行,表示对应的菱形。
输入输出样例 #1
输入 #1
3 输出 #1
.#. #.# .#. 输入输出样例 #2
输入 #2
9 输出 #2
....#.... ...#.#... ..#...#.. .#.....#. #.......# .#.....#. ..#...#.. ...#.#... ....#.... 说明/提示
对于所有测试点,保证 3≤n≤293 \leq n \leq 293≤n≤29 并且 nnn 为奇数。
解析
解法一,矩阵中左上到右下的斜线,行和列的差相等,右上到左下的斜线,行和列的和相等。判断是否位于四条斜线上,是就打印#,不是就打印’.',详见代码:
#include<bits/stdc++.h>usingnamespace std;intmain(){int n,m; cin>>n; m=n/2+1;for(int i=1;i<=n;i++){for(int j=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>usingnamespace std;char a[105][105];int n;intmain(){ cin>>n;for(int j=n/2+1,i=1;j>=1;j--,i++){ a[i][j]='#';}for(int j=n/2+1,i=1;j<=n;j++,i++){ a[i][j]='#';}for(int i=n/2+1,j=1;i<=n;j++,i++){ a[i][j]='#';}for(int i=n/2+1,j=n;i<=n;j--,i++){ a[i][j]='#';}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i][j]==0){ cout<<'.';}else{ cout<<a[i][j];}} cout<<endl;}return0;}