#include #include #include #include #include bool msCheck(char* s); void setTree(int x,int y); struct node{ node* parentNode;//親のノード std::string name; std::vector childNodes;//子のノード }; int main() { int x,y;//人数、質問の数 char t; scanf("%d %d",&x,&y); while(x!=0 || y!=0){ scanf("%c",&t); setTree(x,y); scanf("%d %d",&x,&y); printf("\n"); } } void setTree(int x,int y){ char space[1000];//文字列の読み込み int sCount=0,k,oldCount=0,t; node topNode;//根元となるノード topNode.parentNode=&topNode;//安全のためにトップノードをトップノードとリンク node nAdd;//木構造にADDするノード、名前 node* n1=&topNode;//木構造内での位置 std::map nodes;//名前から木構造のどのポイントに対応するかを指ししめす for(int i=0;iparentNode; } }else if(t==0){ //同じ階層なら、一つ上の階層に戻り、そこから下に幹を一つ伸ばす n1=n1->parentNode; } nAdd.parentNode=n1;//親ノードの設定 n1->childNodes.push_back(nAdd);//新しい幹を追加 n1=&n1->childNodes[n1->childNodes.size()-1];//追加した幹を参照 nodes[n1->name]=n1;//木構造内での位置をマップに保存 oldCount=sCount;//家系図内での階層の深さを保存 } //ここから質問文に対する評価を行う char name1[255],name2[255]; char tempCom[1000]; std::string command; char testCom[1000]; char re; char com1[1000],com2[1000],com3[1000],com4[1000]; for(int i=0;iparentNode->name==name2){ printf("True\n"); }else{ printf("False\n"); } }else if(command=="istheparentof"){ //name1はname2の親 if(nodes[name1]->name==nodes[name2]->parentNode->name){ printf("True\n"); }else{ printf("False\n"); } }else if(command=="isasiblingof"){ //name1とname2は兄弟 if(nodes[name1]->parentNode->name==nodes[name2]->parentNode->name){ printf("True\n"); }else{ printf("False\n"); } }else if(command=="isadescendantof"){ //name2はname1の先祖 n1=nodes[name1]; bool ok=false; while(n1!=&topNode){ n1=n1->parentNode; if(n1->name==name2) ok=true; } if(ok==true){ printf("True\n"); }else{ printf("False\n"); } }else if(command=="isanancestorof"){ //name1はname2の先祖 n1=nodes[name2]; bool ok=false; while(n1!=&topNode){ n1=n1->parentNode; if(n1->name==name1) ok=true; } if(ok==true){ printf("True\n"); }else{ printf("False\n"); } }else{ printf("\n"); } } } bool msCheck(char* s){ int n=strlen(s); int count=0; int mode=0; if(s[0]==' ') return false; for(int i=0;i