在定義了直角坐標系的紙上,畫一個(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;
}
}
}