坐标离散化
2016-01-05 01:56
309 查看
特地地把例题码了一次。
关于坐标的离散化,就是映射,把原来的值映射为下标值。
关于坐标的离散化,就是映射,把原来的值映射为下标值。
#include <iostream> #include <map> #include <algorithm> #include <cstdio> #include <cstring> #include <cstdlib> #include <vector> #include <queue> #include <stack> #include <functional> #include <set> #include<sstream> #include <cmath> using namespace std; #define pb push_back #define PB pop_back #define bk back() #define fs first #define se second #define INF 1e9*2+10 #define sq(x) (x)*(x) #define eps (1e-7) #define clr(x) memset((x),0,sizeof (x)) #define cp(a,b) memcpy((a),(b),sizeof (b)) const int maxn=1005; int W,H,N; int x1[maxn],x2[maxn],Y1[maxn],Y2[maxn]; int fld[maxn*3][maxn*3]; int dir[4][2]={1,0,0,1,0,-1,-1,0}; int compress(int *x1,int *x2,int w) { vector<int> v; for(int i=1;i<=N;i++) { int tx1,tx2; for(int d=-1;d<=1;d++) { tx1=x1[i]+d; tx2=x2[i]+d; if(tx1>=0&&tx1<w) v.pb(tx1); if(tx2>=0&&tx2<w) v.pb(tx2); } } sort(v.begin(),v.end()); v.erase(unique(v.begin(),v.end()),v.end()); for(int i=1;i<=N;i++) { x1[i]=lower_bound(v.begin(),v.end(),x1[i])-v.begin(); x2[i]=lower_bound(v.begin(),v.end(),x2[i])-v.begin(); } return v.size(); } void solve() { W=compress(x1,x2,W); H=compress(Y1,Y2,H); clr(fld); for(int i=1;i<=N;i++) for(int y=Y1[i];y<=Y2[i];y++) for(int x=x1[i];x<=x2[i];x++) fld[y][x]=1; int ans=0; /* for(int x=0;x<W;x++) { for(int y=0;y<H-1;y++) cout<<fld[x][y]<<" "; cout<<fld[x][H-1]<<endl; } */ for(int y=0;y<H;y++) for(int x=0;x<W;x++) { if(fld[y][x]) continue; fld[y][x]=1; ans++; queue<pair<int,int> > q; q.push(make_pair(x,y)); while(!q.empty()) { int xx,yy,nx,ny; xx=q.front().fs,yy=q.front().se; q.pop(); for(int i=0;i<4;i++) { nx=xx+dir[i][0]; ny=yy+dir[i][1]; if(nx<0||nx>=W||ny<0||ny>=H||fld[ny][nx]) continue; fld[ny][nx]=1; q.push(make_pair(nx,ny)); } } } printf("%d\n",ans); } int main() { while(~scanf("%d%d",&W,&H)&&W&&H) { scanf("%d",&N); for(int i=1;i<=N;i++) { scanf("%d%d%d%d",&x1[i],&Y1[i],&x2[i],&Y2[i]); x2[i]-=1; Y2[i]-=1; } solve(); } return 0; }
相关文章推荐
- Ubuntu 14.04 没有system settings的解决办法
- [React Testing] JSX error diffs -- expect-jsx library
- SD卡浏览器
- Part 8 AngularJS filters
- 在移动跨平台框架PhoneGap中的异步体验
- 从指定文件夹读取文件并把读取到的文件写入到指定文件夹
- IOTest把输入的信息,保存到本地,按读取按钮将其读取出来
- IOTest把登录信息保存,下次打开自动读取保存的登录信息,无需再次输入
- 有上下界的网络流
- C# 作业,简单的学生管理系统(控制台)
- KVM网络性能测试(3)
- Guava学习笔记(1):Optional优雅的使用null
- 将别处的web project 导入 eclipse 以后,为什么run as里 没有 run on server 选项
- Android Canvas drawArc方法介绍
- 【重构学习】06 类的重构
- Part 7Handling events in AngularJS
- 11Java语法回顾之io流
- 关于数据类型取值范围相关问题
- js jquery前台解析json字符串
- 又进来了