掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
木構造の練習問題が解けず (ID:72584)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1217 リンク先はプログラムの練習問題です。 コードを書いてサーバに送信するとサーバ側でgccでコンパイル、テストデータによる自動採点をしてくれるというサイトの問題です。 木構造の勉強だと思ってリンク先問題を解くためのコードを書いてみたのですがサーバにコードを送信してみるとランタイムエラーがでてしまいました。 なにかが悪いと思うのですが自分では見つけることができません。 どなたかご指南ご指摘お願いします。 #include<stdio.h> #include<vector> #include<string> #include<string.h> #include<map> void setTree(int x,int y); struct node{ node* parentNode;//親のノード std::string name; std::vector<node> 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[100];//文字列の読み込み int sCount=0,k,oldCount=0,t; node topNode;//根元となるノード topNode.parentNode=&topNode;//安全のためにトップノードをトップノードとリンク node nAdd;//木構造にADDするノード、名前 node* n1=&topNode;//木構造内での位置 std::map<std::string,node*> nodes;//名前から木構造のどのポイントに対応するかを指ししめす for(int i=0;i<x;i++){ scanf("%[^\n]%*c",space);//一行ずつ名前の取得 k=sCount=0; while(space[sCount]==' '){ sCount++;//余分なスペースを削除、ついでにこの人の木構造での階層位置も取得 } while(space[k+sCount]!='\0'){ space[k]=space[k+sCount];//スペース削除 k++; } space[k]='\0'; nAdd.name=space; t=sCount-oldCount; if(t<0){ //家族の図が浅い階層に移動したならその分根元に戻る for(int i=0;i<-t+1;i++){ n1=n1->parentNode; } }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[22],name2[22]; char tempCom[12]; std::string command; for(int i=0;i<y;i++){ scanf("%s",name1);//名前の取得 command="";//質問文の種類 for(int j=0;j<4;j++){ scanf("%s",tempCom);//質問文取得 command+=tempCom; } scanf("%s",name2);//名前の取得 name2[strlen(name2)-1]='\0'; char t; scanf("%c",&t); //質問文の判断 if(command=="isachildof"){ //name1はname2の子供 if(nodes[name1]->parentNode->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"); } } } }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.