博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 3168 Barn Expansion 平面扫描+线段相交问题
阅读量:4114 次
发布时间:2019-05-25

本文共 2606 字,大约阅读时间需要 8 分钟。

题意:给你n个矩形,矩形之间只能是完全隔离或者刚好接触,且没有嵌套关系,判断这些矩形中不与
其他任何矩形相接触的个数
ac代码:
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int big=50000; int max(int a,int b) { return a>b?a:b;}; int min(int a,int b) { return a
=ex[j].y1) { ex[j].y2=max(ex[j].y2,ex[i].y2); return 1; } return 0; } int jiaoy(int i,int j) { //printf("//4\n"); if(ey[i].y==ey[j].y&&ey[i].x2>=ey[j].x1) { ey[j].x2=max(ey[j].x2,ey[i].x2); return 1; } return 0; } void solve() { memset(used,0,sizeof(used)); sort(ex+1,ex+2*n+1,cmpx); sort(ey+1,ey+2*n+1,cmpy); for(int i=1;i<=2*n-1;i++) if(jiaox(i,i+1)) used[ex[i].id]=used[ex[i+1].id]=1; for(int i=1;i<=2*n-1;i++) if(jiaoy(i,i+1)) used[ey[i].id]=used[ey[i+1].id]=1; //printf("//2\n"); int res=0; for(int i=1;i<=n;i++) if(!used[i]) res++; printf("%d\n",res); } int main() { while(~scanf("%d",&n)) { for(int i=1;i<=n;i++) { scanf("%d %d %d %d",&a1,&b1,&a2,&b2); add_edgex(i); add_edgey(i); } solve(); } return 0; }
题目分析:从x和y方向两个方向进行拆边就好,分两个方向进行判断,但是注意下面wa的代码错就错在
自己没有考虑到[1,10]   [2,5]  [7,9]这个情况,因为第一个区间可以完全覆盖第二个区间甚至直接与第三个区间相交
而此时第二哥区间则并没有与第三个区间相交;
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std; #define MM(a) memset(a,0,sizeof(a)) typedef long long ll; typedef unsigned long long ULL; const int mod = 1000000007; const double eps = 1e-10; const int inf = 0x3f3f3f3f; const int big=50000; int max(int a,int b) { return a>b?a:b;}; int min(int a,int b) { return a
=ex[j].y1&&ex[i].y1<=ex[j].y2) return 1; return 0; } int jiaoy(int i,int j) { //printf("//4\n"); if(ey[i].y==ey[j].y&&ey[i].x2>=ey[i+1].x1&&ey[i].x1<=ey[j].x2) return 1; return 0; } void solve() { memset(num,0,sizeof(num)); sort(ex,ex+2*cnt+1,cmpx); sort(ey,ey+2*cnt+1,cmpy); for(int i=1;i<=2*cnt-1;i++) if(jiaox(i,i+1)) { num[ex[i].id]--; num[ex[i+1].id]--; } for(int i=1;i<=2*cnt-1;i++) if(jiaoy(i,i+1)) { num[ey[i].id]--; num[ey[i+1].id]--; //printf("//2\n"); } } void ans() { int res=0; for(int i=1;i<=n;i++) if(num[i]>=0) res++; printf("%d\n",res); } int main() { while(~scanf("%d",&n)) { cnt=0; for(int i=1;i<=n;i++) { scanf("%d %d %d %d",&a1,&b1,&a2,&b2); add_edgex(++cnt); add_edgey(cnt); } solve(); ans(); } return 0; }

转载地址:http://ftgsi.baihongyu.com/

你可能感兴趣的文章
nc 命令详解
查看>>
如何使用 systemd 中的定时器
查看>>
git命令速查表
查看>>
linux进程监控和自动重启的简单实现
查看>>
OpenFeign学习(三):OpenFeign配置生成代理对象
查看>>
OpenFeign学习(四):OpenFeign的方法同步请求执行
查看>>
OpenFeign学习(五):OpenFeign请求结果处理及重试控制
查看>>
OpenFeign学习(六):OpenFign进行表单提交参数或传输文件
查看>>
OpenFeign学习(七):Spring Cloud OpenFeign的使用
查看>>
Ribbon 学习(二):Spring Cloud Ribbon 加载配置原理
查看>>
Ribbon 学习(三):RestTemplate 请求负载流程解析
查看>>
深入理解HashMap
查看>>
XML生成(一):DOM生成XML
查看>>
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
查找最大值最小值
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>