void problem1(Page_tp page) { if(page がHTMLなら) { for(子供に対して) { リンクを増やして、 if(子供への最初の訪問なら) 子供への再帰的処理 } } }とかね。で、これって、ヒントに書いているのとあまり変わらないすよね?
void problem1(Page_tp page); void problem2(Page_tp page, int depth); void userSearch(Page_tp page) { problem1(page); problem2(page, 0); }
それから、visited flag に関しては、うまく処理するとなくすこともできます。
int foo() { char sample0[] = "index.html"; char sample1[] = "index.html"; if(sample0 == sample1) => false になるでしょう、、、
void whywhywhy() { /* 停止したいときは、 *NULL = 0; とか書いておく*/} void problem2(Page_tp page) { ...... /* 以下のコードを挿入 */ { Page_tp target = 調査したいもの; if((strcmp(getName(target), "XXXX.html") == 0) && (userArea(target)->depth >= 3)) whywhywhy(); } ...... }で、gdb で break whywhywhy しておけば、トラブルが起きた瞬間を捕らえることができます。 入力が大きい場合でも、問題箇所を簡単に終えるでしょう。
まずは、深さ優先的に問題を解いた場合について載せます。 この場合、再帰を使って書くのが素直でしょう。
2002.11.18/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp