uva 1312 Cricket Field

来源:互联网 发布:c专家编程怎么样 编辑:程序博客网 时间:2024/06/08 06:57

题意:在一块地上有一堆树,找一个最大无树的正方形(边上可以有树)。输出西南端点的横纵坐标及边长。

分析:枚举,扫描

#include<cstdio>#include<algorithm>#define maxn 110using namespace std;struct Point{    int x, y;} p[maxn];int n, W, H, y[maxn];bool cmp(const Point a, const Point b){    if(a.x == b.x)        return a.y < b.y;    return a.x < b.x;}void init(){    for(int i = 0; i < n; i++)    {        scanf("%d%d", &p[i].x, &p[i].y);        y[i] = p[i].y;    }    y[n] = 0, y[n + 1] = H;    sort(y, y + n + 2);    sort(p, p + n, cmp);}void solve(){    int ans = 0, xx, yy;    int m = unique(y, y + n + 2) - y;    for(int i = 0; i < m; i++)        for(int j = i + 1; j < m; j++)        {            int h = y[j] - y[i], pre = 0, w;            for(int k = 0; k < n; k++)            {                if(p[k].y <= y[i] || p[k].y >= y[j])                    continue;                w = p[k].x - pre;                if(ans < min(w, h))                {                    ans = min(w,h);                    xx = pre;                    yy = y[i];                }                pre = p[k].x;            }            w = W - pre;            if(ans < min(h, w))            {                ans = min(h,w);                xx = pre;                yy = y[i];            }        }    printf("%d %d %d\n",xx, yy, ans);}int main(){    int cas;    scanf("%d", &cas);    while(cas--)    {        scanf("%d%d%d",&n, &W, &H);        init();        solve();       // printf("cas = %d\n",cas);        if(cas)            printf("\n");    }    return 0;}


0 0