hihoCoder_1273_海报清理

这题在当时做的时候做不出来。后来参考网上大牛思想写的代码。大牛网址:http://blog.csdn.net/houxinssdut/article/details/50885954

#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

const int N = 1005;  //最多的海报数量
bool visit[N];
int can[N];
vector<int> mm[N];
int total;

//定义一个点
struct P
{
    int x,y;
    P()
    {
        ;
    }
    P(int x,int y)
    {
        this->x = x;
        this->y = y;
    }
    void inP()
    {
        cin>>this->x>>this->y;
    }
};
//定义一张海报
struct Rect
{
    P pa,pb;
    Rect()
    {
        ;
    }
    void inRect()
    {
        this->pa.inP();
        this->pb.inP();
    }
};
Rect rect[N];
//判断点是否在矩阵内部
bool pin(P p, Rect r)
{
    return p.x>r.pa.x && p.x<r.pb.x && p.y>r.pa.y && p.y<r.pb.y;
}
//判断矩阵之间是否相交
bool isOver(Rect r1, Rect r2)
{
    P p1(max(r1.pa.x, r2.pa.x), max(r1.pa.y, r2.pa.y));
    P p2(min(r1.pb.x, r2.pb.x), min(r1.pb.y, r2.pb.y));
    return p1.x<p2.x && p1.y<p2.y;
}

void dfs(int i)
{
    total++;
    visit[i] = true;
    for(size_t j=0; j<mm[i].size(); ++j)
    {
        if(visit[mm[i][j]] == 0)
        {
            dfs(mm[i][j]);
        }
    }
}

int main()
{
    int n,w,h;
    int i,j;
    int ans,index;
    cin>>w>>h>>n;
    for(i=0; i<n; ++i)
    {
        rect[i].inRect();
    }
    memset(can, 0, sizeof(can));
    for(i=0; i<n; i++)
    {
        for(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(P(rect[i].pa.x, rect[i].pb.y), rect[j])) can[i] |= 4;
            if(pin(P(rect[i].pb.x, rect[i].pa.y), rect[j])) can[i] |= 8;
            if(isOver(rect[i], rect[j]))
                mm[i].push_back(j);
        }
    }
    ans = 0;
    for(i=0; i<n; ++i)
    {
        if(can[i] != 15)
        {
            memset(visit, 0, sizeof(visit));
            total = 0;
            dfs(i);
            if(total > ans)
            {
                ans = total;
                index = i+1;
            }
        }
    }
    cout<<ans<<" "<<index<<endl;
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值