hihoCoder 1273 清理海报

来源:互联网 发布:java线程共享数据 编辑:程序博客网 时间:2024/04/28 13:36

题目链接:http://hihocoder.com/problemset/problem/1273

这个题的题意不太明确。A覆盖B的条件是公共面积大于0,也就是一条边重合不算;角被覆盖的条件是角在矩形的内部,在边上也不算;还有如果B覆盖A,C覆盖B,C不覆盖A,如果撕开A的话,C也会被撕掉,也就是可传递。

其实就是判断矩形相交,然后建图,跑dfs,思路还是很简单的(虽然矩形相交写崩了=。=)。

好久没写题了,发现了一些缺点:

  1. 结构体定义的时候爱偷懒,导致后面写起来比较烦
  2. 代码过于紧凑,看了其他人的代码之后感觉自己的不好看T T
  3. 还有就是分类太乱了,变量定义啥的到处都是- -
发个代码:
#include <cstdio>#include <iostream>#include <cstring>#include <vector>using namespace std;const int maxn = 1010;struct Point{    int x,y;    Point(){}    Point(int a,int b){        x = a;y = b;    }    void in(){        scanf("%d%d",&x,&y);    }};struct Rect{    Point pa,pb;    void inpt(){        pa.in();        pb.in();    }}rect[maxn];int w,h,n;int can[maxn];vector<int>mm[maxn];int tot;bool vis[maxn];bool pin(Point p, Rect rec){    return (p.x > rec.pa.x && p.x < rec.pb.x && p.y > rec.pa.y && p.y < rec.pb.y);}bool over(Rect a, Rect b){    Point pa, pb;    pa = Point(max(a.pa.x, b.pa.x), max(a.pa.y, b.pa.y));    pb = Point(min(a.pb.x, b.pb.x), min(a.pb.y, b.pb.y));    if(pa.x < pb.x && pa.y < pb.y)return true;    return false;}void dfs(int x){    vis[x] = 1;    tot ++;    for(int i = 0;i < mm[x].size();i ++){        if(vis[mm[x][i]] == 0){            dfs(mm[x][i]);        }    }}int main(){    scanf("%d%d%d",&w,&h,&n);    for(int i = 0;i < n;i ++){        rect[i].inpt();    }    for(int i = 0;i < n;i ++){        for(int j = i + 1;j < n;j ++){            if(pin(rect[i].pa, rect[j]))can[i] |= 1;            if(pin(rect[i].pb, rect[j]))can[i] |= 2;            if(pin(Point(rect[i].pa.x, rect[i].pb.y), rect[j]))can[i] |= 4;            if(pin(Point(rect[i].pb.x, rect[i].pa.y), rect[j]))can[i] |= 8;            if(over(rect[i],rect[j]))mm[i].push_back(j);        }    }    int ans = 0,chos = 0;    for(int i = 0;i < n;i ++){        if(can[i] != 15){            memset(vis,0,sizeof(vis));            tot = 0;            dfs(i);            if(tot > ans){                ans = tot;                chos = i + 1;            }        }    }    cout<<ans<<' '<<chos<<endl;    return 0;}



1 0