题解 B2083 【画矩形】
题解
做法 1
对于实心矩形,我们可以用嵌套循环填充所有字符。
具体而言,我们令
对于空心矩阵,你可以像其他题解那样,特判当前是否是第一行与最后一行。当然,更简单的做法是,首先填充实心矩阵,然后如法炮制把中间挖空了(注意是填充空白,而不是
做法 2
在 C++ 中,我们可以用
小技巧
- 在下文代码中,我们使用了
\verb!printf! 输出 C 风格字符串。使用控制字符\verb!s! 告诉函数我们要输出字符串,然后我们传入字符串的头指针。对于二维字符数组,本质上是若干个一维的字符数组集合而成。
参考代码
代码 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;
}```