缺失的拼图

题目名称:缺失的拼图

题目链接:缺失的拼图

描述

小Hi在玩一个拼图游戏。如下图所示,整个拼图是由N块小矩形组成的大矩形。现在小Hi发现其中一块小矩形不见了。给定大矩形以及N-1个小矩形的顶点坐标,你能找出缺失的那块小矩形的顶点坐标吗?

输入

第一行包含一个整数 N N N

第二行包含四个整数 ( X 0 , Y 0 ) , ( X ′ 0 , Y ′ 0 ) (X0, Y0), (X'0, Y'0) (X0,Y0),(X0,Y0),代表大矩形左下角和右上角的坐标。

以下 N − 1 N-1 N1行每行包含四个整数 ( 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值