题目大意:在几何数学中的笛卡尔坐标系上给出每个矩形块左下角坐标,x轴方向和y轴方向长度和z轴高度(均为实数),求正视图能被看见的矩形块,输出时x小者优先,若x相同,则y小者优先。
思路分析:用结构体存储每个矩形块,利用sort,很容易按照输出顺序排列。关键在于如何判断矩形块是否可见,对于二维坐标的遍历当然是要用离散化的思想。
#include<cstdio> #include<algorithm> #include<iostream> #include<set> #include<vector> using namespace std; struct building { int id; double x,y,w,d,h; bool operator < (const building& b) const{ return ((x<b.x) || (x==b.x && y<b.y)); } }b[200]; int n,num=0; bool isVisible(int i,int midx) { if(!(b[i].x<=midx && b[i].x+b[i].w>=midx)) return false; for(int j=0;j<n;j++) { if(b[j].h>=b[i].h && b[j].y<b[i].y && b[j].x <=midx && b[j].x+b[j].w>=midx) return false; } return true; } int main(void) { while(cin>>n && n!=0) { if(num!=0) puts(""); printf("For map #%d, the visible buildings are numbered as follows: ", ++num); set<double> setx; // 去重 for(int i=0;i<n;i++) { scanf("%lf %lf %lf %lf %lf", &b[i].x, &b[i].y, &b[i].w, &b[i].d, &b[i].h); b[i].id = i+1; setx.insert(b[i].x); setx.insert(b[i].x+b[i].w); } sort(b,b+n); vector<double> x(setx.begin(),setx.end()); int cnt=0; for (int i = 0; i < n; i ++) { for (int j = 0; j < x.size()-1; j ++) { if (isVisible(i, (x[j]+x[j+1])/2)) { cnt ++; printf("%s%d", cnt != 1 ? " ":"", b[i].id); break; } } } puts(""); } return 0; }