您的位置:首页 > 其它

hihoCoder_1273_海报清理

2016-04-09 19:14 357 查看
这题在当时做的时候做不出来。后来参考网上大牛思想写的代码。大牛网址: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
;
int can
;
vector<int> mm
;
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
;
//判断点是否在矩阵内部
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: