《信息学奥赛一本通》第82题:画矩形
题目描述
根据输入的四个参数: a , b , c , f a,b,c,f a,b,c,f 参数,画出对应的矩形。
前两个参数 a , b a,b a,b 为整数,依次代表矩形的高和宽;
第三个参数 c c c 是一个字符,表示用来填充的矩形符号;
第四个参数 f f f 为整数, 0 0 0 代表空心,否则代表实心。
具体例子请见样例。
输入格式
第一行:a,b,c,f。
输出格式
一个矩形。
输入输出样例 #1
输入 #1
7 7 @ 0
输出 #1
@@@@@@@
@ @
@ @
@ @
@ @
@ @
@@@@@@@
说明/提示
数据范围:
3 ≤ a ≤ 100 3 \le a \le 100 3≤a≤100。
5 ≤ b ≤ 100 5 \le b \le 100 5≤b≤100。
保证 c c c 是一个可见的字符(ASCII 码在 [ 33 , 126 ] [33,126] [33,126] 内)。 0 ≤ f ≤ 1 0 \le f \le 1 0≤f≤1。
大家好,我是莫小特。
这篇文章给大家带来《信息学奥赛一本通》中的第 82题:画矩形。
一、题目描述
洛谷的题号是:B2083 画矩形
二、题意分析
这道题是信息学奥赛一本通练习题的第 82 题。
根据输入格式的描述,输入有四个参数,前两个为整数 a 和 b,数据范围: 3 ≤ a ≤ 100 3 \le a \le 100 3≤a≤100, 5 ≤ b ≤ 100 5 \le b \le 100 5≤b≤100,可以选用 int 类型,第三个为字符 c,使用 char 类型,第四个为整数 f,数据范围: 0 ≤ f ≤ 1 0 \le f \le 1 0≤f≤1,使用 int 类型。
此处要注意输入顺序,千万不能写错了,否则很难发现错误的,先两个整数,再接着一个字符,最后再一个整数。
int a,b,f;
char c;
cin>>a>>b>>c>>f;
根据题目意思,需要根据 f 的值输出结果,如果 f 等于 0 代表空心,其他则代码实心,因此需要先判断 f 的值,使用 if 双分支语句。
if(f==0)//空心的情况
{
}
else//实心的情况
{
}
空心的话需要输出高为 a,宽为 b 的矩形,也就是 a 行 b 列的矩形,使用 for 循环嵌套来实现。
for(int i=1;i<=a;i++)//行
{
for(int j=1;j<=b;j++)//列
{
}
}
根据题目中所说,空心即除了四条边用字符所描述的符合代替,其他的用空格代替,所以直接进行特殊判断,四条边,也就是第一行和最后一行,第一列和最后一列,注意行的结束是 a,列的结束是 b,不能搞错了,使用逻辑运算符或者 ||
连接。
for(int i=1;i<=a;i++)//行
{
for(int j=1;j<=b;j++)//列
{
//第一行 最后一行 第一列 最后一列
if(i==1||i==a||j==1||j==b)
{
cout<<c;
}
else
{
cout<<" ";//输出空格
}
}
cout<<endl;//不能忘记换行
}
而实心就不需要考虑空格情况,直接输出字符 c 即可。
for(int i=1;i<=a;i++)//行
{
for(int j=1;j<=b;j++)//列
{
cout<<c;
}
cout<<endl;//不能忘记换行
}
整合一下。
if(f==0)//空心的情况
{
for(int i=1;i<=a;i++)//行
{
for(int j=1;j<=b;j++)//列
{
//第一行 最后一行 第一列 最后一列
if(i==1||i==a||j==1||j==b)
{
cout<<c;
}
else
{
cout<<" ";//输出空格
}
}
cout<<endl;//不能忘记换行
}
}
else//实心的情况
{
for(int i=1;i<=a;i++)//行
{
for(int j=1;j<=b;j++)//列
{
cout<<c;
}
cout<<endl;//不能忘记换行
}
}
按照样例输入对数据进行验证。
符合样例输出,到网站提交测评。
测试通过!
三、完整代码
该题的完整代码如下:
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,f;
char c;
cin>>a>>b>>c>>f;
if(f==0)//空心的情况
{
for(int i=1;i<=a;i++)//行
{
for(int j=1;j<=b;j++)//列
{
//第一行 最后一行 第一列 最后一列
if(i==1||i==a||j==1||j==b)
{
cout<<c;
}
else
{
cout<<" ";//输出空格
}
}
cout<<endl;//不能忘记换行
}
}
else//实心的情况
{
for(int i=1;i<=a;i++)//行
{
for(int j=1;j<=b;j++)//列
{
cout<<c;
}
cout<<endl;//不能忘记换行
}
}
return 0;
}
四、总结
这道题考察了循环嵌套、条件判断和格式化输出,有以下知识点:
1、输入参数:要注意顺序(高、宽、字符、标志位),尤其字符 c 的读取。
2、f 的作用:决定矩形是空心还是实心,属于典型的分支结构应用。
3、循环实现:通过两层 for 循环分别控制行和列,再配合边界条件判断,就能输出对应的矩形。
常见易错点:
符号必须是英文字符,换行不能遗漏,否则会导致格式错误。
如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注我哦!
如果有更好的方法也可以在评论区评论哦,我都会看哒~
我们下集见~