您的位置:首页 > 其它

坐标离散化

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: