题解 B2083 【画矩形】

· · 题解

题解

做法 1

对于实心矩形,我们可以用嵌套循环填充所有字符。

具体而言,我们令 i1 枚举到 a ;在枚举 i 的里面,令 j1 枚举到 b 。对于每对 (i,j) ,填充 S_{i,j} 为字符 c 。那么实心矩阵的问题就做完了。

对于空心矩阵,你可以像其他题解那样,特判当前是否是第一行与最后一行。当然,更简单的做法是,首先填充实心矩阵,然后如法炮制把中间挖空了(注意是填充空白,而不是 \verb!ASCII! 码当中的 0 代表的字符)。于是问题解决了。

做法 2

在 C++ 中,我们可以用 \verb!memset! 指令填充一段字符。因此,我们并不需要嵌套循环,而是直接让 i1 枚举到 a ,使用 \verb!memset! 填充 b 个字符。

小技巧

参考代码

代码 1

#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647;
const int MAXN=100+3;
int a,b,f; char c,S[MAXN][MAXN];
int main(){
    scanf("%d%d%*c%c%d",&a,&b,&c,&f);
           up(1,a  ,i) up(1,b  ,j) S[i][j]=c;
    if(!f) up(2,a-1,i) up(2,b-1,j) S[i][j]=' ';
    up(1,a,i) printf("%s\n",S[i]+1);
    return 0;
}

代码 2


#include<bits/stdc++.h>
#define up(l,r,i) for(int i=l,END##i=r;i<=END##i;++i)
#define dn(r,l,i) for(int i=r,END##i=l;i>=END##i;--i)
using namespace std;
typedef long long i64;
const int INF =2147483647;
const int MAXN=100+3;
int a,b,f; char c,S[MAXN][MAXN];
int main(){
    scanf("%d%d%*c%c%d",&a,&b,&c,&f);
           up(1,a  ,i) memset(S[i]+1, c ,b  );
    if(!f) up(2,a-1,i) memset(S[i]+2,' ',b-2);
    up(1,a,i) printf("%s\n",S[i]+1);
    return 0;
}```