uva

mac2022-06-30  30

细节题 不建议做 做完脖子疼

#include<iostream> #include<cmath> #include<vector> #include<string> #include<map> #include<algorithm> using namespace std; struct Maps { string name; double x1,y1,x2,y2,cx,cy; pair<double,double> cp; double Ratio,area; int level; Maps(string s,double a,double b,double c,double d):name(s),x1(a),y1(b),x2(c),y2(d) { if(x1>x2) swap(x1,x2); if(y1>y2) swap(y1,y2); Ratio=(y2-y1)/(x2-x1); area=(y2-y1)*(x2-x1); cx=(x2-x1)/2; cy=(y2-y1)/2; level=-1; } }; vector<Maps> vec; map<string,pair<double,double>> point; pair<double,double> kp; bool contain(pair<double,double> a,Maps b) { return a.first>=b.x1&&a.first<=b.x2&&a.second>=b.y1&&a.second<=b.y2; } bool cmp(double a,double b) { return a>b; } bool cmp1(Maps a,Maps b) { if(a.level!=b.level) return a.level>b.level; double d1=hypot(kp.first-a.cx,kp.second-a.cy); double d2=hypot(kp.first-b.cx,kp.second-b.cy); if(fabs(d1-d2)>0) return d1<d2; d1=fabs(a.Ratio-0.75); d2=fabs(b.Ratio-0.75); if(fabs(d1-d2)>0) return d1<d2; d1=hypot(kp.first-a.x2,kp.second-a.y1); d2=hypot(kp.first-b.x2,kp.second-b.y1); if(fabs(d1-d2)>0) return d1>d2; return a.x1<b.x1; } int main() { string s; int flag=0; double a,b,c,d; int Le; while(cin>>s&&s!="END") { if(s=="MAPS") flag=1; else if(flag==1&&s!="LOCATIONS") { cin>>a>>b>>c>>d; vec.push_back(Maps(s,a,b,c,d)); } else if(s=="LOCATIONS") flag=2; else if(flag==2&&s!="REQUESTS") { cin>>a>>b; point[s]=make_pair(a,b); } else if(s=="REQUESTS") flag=3; else if(flag==3) { cin>>Le; if(point.count(s)==0) cout<<s<<"at detail level "<<Le<<" unknown location"<<endl; else { printf("%s at detail level %d ", s.c_str(), Le); kp=point[s]; vector<double> v_area; vector<Maps> v_maps; for(int i=0;i<vec.size();i++) { if(contain(kp,vec[i])) { v_maps.push_back(vec[i]); v_area.push_back(vec[i].area); } } sort(v_area.begin(),v_area.end(),cmp); double last=-1.0; int cnt=0; for(int i=0;i<v_area.size();i++) { if(v_area[i]!=last) { last=v_area[i],cnt++; for(int j=0;j<v_maps.size();j++) { if(v_maps[j].area==last) { v_maps[j].level=cnt; } } } } sort(v_maps.begin(),v_maps.end(),cmp1); if(v_maps.size()==0) { puts("no map contains that location"); } else if(Le>v_maps[0].level) { printf("no map at that detail level;using %s\n", v_maps[0].name.c_str()); } else { for(int i=0;i<v_maps.size();i++) { if(v_maps[i].level==Le) { printf("using %s\n", v_maps[i].name.c_str()); break; } } } } } } }
最新回复(0)