题意:一个W*H(1<=W,H<=10000)网格里有有n(0<=n<=100)棵树,要求找一个最大空正方形
思路:枚举y坐标,每次遍历所有点,判断是否有点落在正方形内,有的话维护最优解
#include <bits/stdc++.h>
//#define ll long long
#define ll unsigned long long
#define INF 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
const int maxn = 100 + 2;
int n,w,h,d[maxn];
struct node
{
int x,y;
bool operator <(const struct node & q)const
{
if(x == q.x) return y < q.y;
return x < q.x;
}
}p[maxn];
void init()
{
scanf("%d%d%d",&n,&w,&h);
for(int i = 0;i < n;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
d[i] = p[i].y;
}
d[n] = 0,d[n + 1] = h;
sort(p,p + n);
sort(d,d + n + 2);
}
void solve()
{
int ans = 0,ansx,ansy;
int m = unique(d,d + n + 2) - d;
for(int i = 0;i < m;i++)
{
for(int j = i + 1;j < m;j++)
{
int miny = d[i],maxy = d[j];
int ww = 0,hh = maxy - miny,tmp = 0;
for(int k = 0;k < n;k++)
{
if(p[k].y <= miny || p[k].y >= maxy) continue;
ww = p[k].x - tmp;
if(ans < min(ww,hh))
{
ans = min(ww,hh);
ansx = tmp,ansy = miny;
}
tmp = p[k].x;
}
ww = w - tmp;
if(ans < min(ww,hh))
{
ans = min(ww,hh);
ansx = tmp,ansy = miny;
}
}
}
printf("%d %d %d\n",ansx,ansy,ans);
}
int main()
{
int T; scanf("%d",&T);
while(T--)
{
init();
solve();
if(T) printf("\n");
}
return 0;
}