1031-Simple GUI Application
XMLの構文解析をする問題。
構文解析をしたら条件を満たす一番深い所にあるパネルを求めるだけで完了する。
最初に入力を
条件分岐は不要になる。
実装(C++)
#include <cstdio> #include <vector> #include <iostream> #include <string> using namespace std; struct Panel{ int x1,x2,y1,y2; string name; vector<Panel> child; }; Panel parse(string p){ Panel P;string n;int i,depth=0; if(p=="")return P; for(i=1;;i++){ if(p[i]=='>')break; n+=p[i]; } P.name=n; sscanf(p.c_str()+n.size()+2,"%d,%d,%d,%d<",&P.x1,&P.y1,&P.x2,&P.y2); for(;;i++){ if(p[i]=='<')break; } p=p.substr(i); p=p.substr(0,p.size()-n.size()-3);n=""; for(i=0;i<(int)p.size();i++){ if(p.substr(i,2)=="</"){ depth--;n+=p.substr(i,2);i++; }else if(p.substr(i,1)=="<"){ depth++;n+=p.substr(i,1); }else if(p.substr(i,1)==">"&&depth==0){ P.child.push_back(parse(n+">")); n=""; }else{ n+=p.substr(i,1); } } return P; } istream &operator>>(istream &in,Panel &p){ string s;in >> s; s="<OUT OF MAIN PANEL>-1,-1,10001,10001"+s+"</OUT OF MAIN PANEL>"; p=parse(s); return in; } int mdepth,mcount;string mname; void slove(int x,int y,Panel &p,int depth){ if(p.x1<=x&&x<=p.x2&&p.y1<=y&&y<=p.y2){ if(mdepth<depth){ mdepth=depth; mname=p.name; mcount=p.child.size(); } for(int i=0;i<(int)p.child.size();i++){ slove(x,y,p.child[i],depth+1); } } } int main(){ int n;int x,y;Panel p; for(;cin >> n,n;){ cin >> p; for(;n--;){ cin >> x >> y; mdepth=-1; slove(x,y,p,0); cout << mname << " " << mcount << endl; } } return 0; }