POJ 3347 Kadj Squares(复杂的线段相交问题)

题意:给予n个正方形,要求45°角放置,最左边的正方形紧贴Y轴,所有的正方形的下面的端点都在X轴上。然后按照正方形不能交错但要尽可能的挨着的原则,摆放,最后输出从上往下看能看到的正方形的编号。

思路:每新增一个正方形,就让它与左侧的每一个正方形贴紧,求其左端坐标,最终结果一定是最大的那个。然后求相应的最右端坐标。这样就转化为了线段,最后求出每条线段没有被覆盖的长度,如果长度大于0,即可输出,

看了一些别人的解题报告,扩大√2倍就能避免小数。

附上代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;

struct square{
    int left;
    int right;
    int len;
}s[55];

int main()
{
    int n;
    while(cin >>n&&n){

        for(int i=0 ;i<n ;i++){

            cin>>s[i].len;
            s[i].left=0;
            for(int j=0 ;j<i ;j++){

                s[i].left=max(s[i].left,s[j].right-abs(s[i].len-s[j].len));
            }
            s[i].right=s[i].left+s[i].len*2;
        }

        for(int i=1 ;i<n ;i++){

            for(int j=0 ;j<i ;j++){

                if(s[i].left<s[i].right){

                    if(s[i].len>s[j].len && s[i].left<s[j].right)
                        s[j].right=s[i].left;
                    else if(s[i].len<s[j].len && s[i].left<s[j].right)
                        s[i].left=s[j].right;
                }
            }
        }
        bool mark=true;
        for(int i=0; i<n; i++)
            if(s[i].left<s[i].right){
                if(mark)
                    printf("%d", i+1), mark=false;
                else printf(" %d", i+1);
            }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值