poj3347 Kadj Squares

题目链接:http://poj.org/problem?id=3347

题意:有一些正方形相互靠着(第一个左边靠着y轴),与x、y轴所成角为45度,问:从上往下看,能看得到哪些正方形(看得到部分即可),并按编号的升序排列。

思路:求出每个正方形最左和最右边点的坐标,再对任意一个正方形,根据它与其它正方形的边长和最左最右点坐标的关系,更新每个正方形最左最右点的坐标,

         最后若最右点坐标大与最左点的坐标,说明该正方形可见,否则不可见。

         注意:在求每个正方形的最左最右点的坐标时,首先要确定当前正方形与哪个正方形靠在一起,判断方法是,求出该正方形与每个正方形靠在一起时最左点

                  的坐标,该正方形靠着的必定是求出的坐标最大的那个正方形。

#include <iostream>
#include <cstdio>
using namespace std;

struct Square {
    int len, l, r;
} sq[55];

int main()
{
    int n, i, j;

    while (scanf ("%d", &n) && n) {
        for (i = 1; i <= n; i++) {
             scanf ("%d", &sq[i].len);
             sq[i].l = 0;
             for (j = 1; j < i; j++) {
                  int tl;
                  if (sq[i].len <= sq[j].len) tl = sq[j].l + sq[j].len + sq[i].len;   //求最左点坐标
                  else tl = sq[j].l + 3*sq[j].len - sq[i].len;
                  if (tl > sq[i].l) sq[i].l = tl;
             }
             sq[i].r = sq[i].l + 2*sq[i].len;   //求最右点坐标
        }
        for (i = 2; i <= n; i++)
            for (j = 1; j < i; j++) {
                if (sq[j].len < sq[i].len && sq[j].r > sq[i].l)   //根据边长及最左最右点坐标,更新
                    sq[j].r = sq[i].l;
                else if (sq[j].len > sq[i].len && sq[j].r > sq[i].l)
                    sq[i].l = sq[j].r;
            }
        for (i = 1; i <= n; i++)
            if (sq[i].l < sq[i].r)   //当最右点坐标大于最左点时,该正方形可见
               printf ("%d ", i);
        printf("\n");
    }
    return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值