探索プログラムは、再帰呼び出しの関数で書くかわりに、リスト構造で書ける。
リストで書く利点は思いつくところでざっとあげる。
・スタックオーバーフローの心配をしなくてよい。
・見通しが利く。
・探索に関して俯瞰したような処理もしやすい。
過去の上野のパンダの名前で「ファンファン」と「フェイフェイ」というのがあった。
今回の問題は
「フ・ァ・ン・ェ・イ」という5個のカタカナを使い、6文字以下で作れる名前にはどんなものがあるか?
というもの。
ひとつのポイントは「ァから始まるのはおかしい」「ンンとならない」とかそういう禁則があるということ。「イェ」と「イァ」はなしにした。
int _tmain(int argc, _TCHAR* argv[])
{
List<String^>^ fanfei = gcnew List<String^>();
fanfei->Add("フ");
fanfei->Add("イ");
for(;;){
if(fanfei->Count
break;
}
int index=0; // 横型探索
// int index=fanfei->Co
String^ abab=fanfei[ind
Console::WriteL
if(abab->Length<6
if(abab->EndsWit
fanfei->Add(abab
fanfei->Add(abab
fanfei->Add(abab
fanfei->Add(abab
fanfei->Add(abab
}else if(abab->EndsWit
fanfei->Add(abab
fanfei->Add(abab
fanfei->Add(abab
}else if(abab->EndsWit
fanfei->Add(abab
fanfei->Add(abab
}else if(abab->EndsWit
fanfei->Add(abab
fanfei->Add(abab
fanfei->Add(abab
}
}
fanfei->RemoveAt
}
}
一行かえるだけで横型探索と縦型探索の切り替えができる。
今、登録した項目(リストで言えば後ろ側)をどんどん調べていけば縦型探索。
そうでなく、リストの前側から処理していけば横型探索。
横型探索を再帰関数で書くのはそう簡単でない(できない?)のでこの点もリストで書いた効能といえる。
横型探索の出だしは
フ・イ・フフ・ファ・フン・フェ・フイ・イフ・イン・イイ・フフフ・フファ・フフン・フフェ・フフイ・ファフ・ファン・ファイ・フンフ・・・
(まだ、3文字以下の単語しか現れてない)
縦型探索の出だしは
イ・イイ・イイイ・イイイイ・イイイイイ・イイイイイイ・イイイイイン・イイイイイフ・イイイイン・・・
(6文字の単語が6個目に現れてる)