题目名称:缺失的拼图
题目链接:缺失的拼图
描述
小Hi在玩一个拼图游戏。如下图所示,整个拼图是由N块小矩形组成的大矩形。现在小Hi发现其中一块小矩形不见了。给定大矩形以及N-1个小矩形的顶点坐标,你能找出缺失的那块小矩形的顶点坐标吗?
输入
第一行包含一个整数 N N N。
第二行包含四个整数 ( X 0 , Y 0 ) , ( X ′ 0 , Y ′ 0 ) (X0, Y0), (X'0, Y'0) (X0,Y0),(X′0,Y′0),代表大矩形左下角和右上角的坐标。
以下 N − 1 N-1 N−1行每行包含四个整数 ( X i , Y i ) , ( X i ′ , Y i ′ ) (X_i, Y_i), (X'_i, Y'_i) (Xi,Yi),(Xi′,Yi′),代表其中一个小矩形的左下角和右上角坐标。
对于30%的数据, 1 < = N < = 1000 1 <= N <= 1000 1<=N<=1000
对于100%的数据, 1 < = N < = 100000 1 <= N <= 100000 1<=N<=100000 所有的坐标 ( X , Y ) (X, Y) (X,Y)满足 $0 <= X, Y <= 100000000 $
输出
输出四个整数 ( X , Y ) , ( X ′ , Y ′ ) (X, Y), (X', Y') (X,Y),(X′,Y′)代表缺失的那块小矩形的左下角和右上角的坐标。
样例输入
5
0 0 4 5
0 0 3 1
0 1 2 5
3 0 4 5
2 2 3 5
样例输出
2 1 3 2
解题思路
乍一看是一道类似于线段树的问题,后来仔细想想是一道数学问题,正如讨论中所说到的,只要再这个点不存在缺失的矩形,那么这个点一定是另一个矩形的坐标点,因此,当这个点出现的次数为单次时,那么一定再该处缺失。
使用pair来存储矩形的坐标点比定义结构体要方便好多啊。
完整代码
#include<bits/stdc++.h>
using namespace std;
map<pair<int,int>,int>m;
pair<int,int> leftup,rightup,leftdown,rightdown; //矩形的四个坐标点
int n;
void init(){ //计算出每个坐标点所在的位置,并统计改坐标点出现次数
cin>>n;
for(int i=0;i<n;i++){
cin>>leftup.first;
cin>>leftup.second;
cin>>rightdown.first;
cin>>rightdown.second;
rightup.first=rightdown.first;
rightup.second=leftup.second;
leftdown.first=leftup.first;
leftdown.second=rightdown.second;
m[leftup]++;
m[rightup]++;
m[leftdown]++;
m[rightdown]++;
}
}
//遍历坐标点,如果出现次数为单次,那么该处一定缺失
//由于map遍历时自带排序,即第一次和第四次出现的点一定是左上和右下所在的点
void solve(){
int i=0;
for(map<pair<int,int>,int>::iterator it=m.begin();it!=m.end();it++){
if(it->second%2==1){
if(i==0) cout<< it->first.first <<" "<< it->first.second <<" ";
if(i==3) cout<< it->first.first <<" "<< it->first.second <<endl;
i++;
}
}
}
int main(){
init();
solve();
return 0;
}