1031-Simple GUI Application

XML構文解析をする問題。
構文解析をしたら条件を満たす一番深い所にあるパネルを求めるだけで完了する。
最初に入力を-1,-1,10001,10001{実入力} のように加工することで、
条件分岐は不要になる。

実装(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;
}