题目链接: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;
}