AcWing 3203. 画图
原题链接
简单
作者:
大瓜娃子
,
2021-02-04 20:25:24
,
所有人可见
,
阅读 1514
C++ 代码
1.//用二维数组模拟直角坐标系 用bool类型表示是否染色
#include<cstdio>
#include<cstring>
int main(){
int n,x1,y1,x2,y2;
bool flag[105][105];
memset(flag,0,sizeof(flag));
scanf("%d",&n);
while(n--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
for(int i=x1;i<x2;i++)
for(int j=y1;j<y2;j++) flag[i][j]=true;
}
int ans=0;
for(int i=0;i<102;i++)
for(int j=0;j<102;j++) ans+=flag[i][j];
printf("%d\n",ans);
return 0;
}
思路
开一个105*105的数组,一边输入一边做标记,完了遍历一下整个数组,就能统计出来了。
2.
问题分析:
若干个矩形叠加在一起,要算出其面积,看起来有点复杂。关键是其面积是由若干正方形组成的。计算的方法有两种:
1.将各个正方形标记出来,然后再统计计算其面积。
2.将各个正方形面积累加起来,然后去掉重叠部分。哪些部分重叠也需要进行标记后才能判定。
程序说明:
本程序采用第2种方法进行计算。
提交后得100分的C++语言程序如下:
/* CCF201409-2 画图 */
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100;
bool flag[N+1][N+1];
int main()
{
int n, x1, y1, x2, y2, sum=0;
// 变量初始化
memset(flag, false, sizeof(flag));
// 输入数据,计算处理
cin >> n;
for(int i=1; i<=n; i++) {
// 输入数据
cin >> x1 >> y1 >> x2 >> y2;
// 累加面积
sum += (x2 - x1) * (y2 - y1);
// 标记和去除重叠部分
for(int i=x1; i<x2; i++)
for(int j=y1; j<y2; j++) {
if(flag[i][j])
sum--;
flag[i][j] = true;
}
}
// 输出结果
cout << sum << endl;
return 0;
}
最后的循环为什么不能把终止条件改成<=,就是i<=x2,j<=y2
计算左下角吧,应该不能等于
写的很好,学到了
这个博客有历年CSF的题解 https://tigerisland.blog.csdn.net/article/details/54755895
hh 谢谢 我不考这个呀,我只是刷一下日题,yxc现在日题都是ccf了
其它博客大多都只能做3题