AOJ-0531 Paint Color

来源:互联网 发布:手机预装软件 编辑:程序博客网 时间:2024/05/29 15:41
我也是醉了。

这个题还限制内存。。。第一次碰到


#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;}


0 0
原创粉丝点击