在定义了直角坐标系的纸上,画一个(x1,y1)到(x2,y2)的矩形,将矩形涂抹,输入不止一个矩形,计算总共的涂抹面积。
#include <iostream> #include <vector> using namespace std; vector<vector<int>> v; void tu(int x1,int y1,int x2,int y2) { for(int i=x1+1;i<=x2;i++) { for(int j=y1+1;j<=y2;j++) { vector<int> temp; temp.push_back(i); temp.push_back(j); //遍历容器v,只要所有的都不跟当前坐标一样,那就可以写进去,否则的话不用涂抹 bool s=false; for(int k=0;k<v.size();k++) { if(v[k]==temp) { s=true; } } if(!s) { v.push_back(temp); } temp.clear(); } } } int main() { //计算所有矩形的面积,两两相交,去掉公共部分面积。 //但是相交的话情况太多,经不住推敲,我想到了涂抹函数,一个格子一个格子涂抹,最后只要计算涂抹的大小即可。 int n; while(cin>>n) { if(n<0 || n>100) { cout<<"请重新输入:"<<endl; } else break; } for(int i=0;i<n;i++) { int x1,y1,x2,y2; while(cin>>x1>>y1>>x2>>y2) { if(x1<0 || x1>100 || y1<0 || y1>100 ||x2<0 || x2>100 || y2<0 || y2>100) { cout<<"请重新输入:"<<endl; } else break; } tu(x1,y1,x2,y2); } cout<<v.size()<<endl; return 0; }
方法改进:
每次都要遍历,然后一个一个点去查看,成本是成倍增长的,所以不能这样
我们想象一下贴图过程,你贴入一个矩形,加上其面积之外是不是需要再去掉他的重叠面积,所以我们引入标记数组,如果数组有东西,那就减1,如果没有,不管,但是要给加入的矩形涂色
也就是标记上。
//当然,前提要将flag数组初始化为false;
for(int i=1;i<=n;i++) {
cin>>x1>>y1>>x2>>y2;
sum+=(x2-x1)*(y2-y1);
for(int j=x1;j<x2;j++)
{
for(int k=y1;k<y2;k++)
{
if(flag[j][k])
sum--;
flag[j][k]=true;
}
}
}