計算矩形面積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