计算矩形面积C++


在定义了直角坐标系的纸上,画一个(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;
    }
  } 
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM