これは私に分割統治法を考えさせます。次のようなものかもしれません (これは少し壊れた疑似コードです。fence-post エラーなどがあるかもしれません):
retval[size] check()
{
bool[size] retval = ALLFALSE;
bool[size] flut1 = ALLFALSE;
bool[size] flut2 = ALLFALSE;
for (int i = 0; i < size/2; ++i) flut1[i] = TRUE;
for (int i = size/2; i < size; ++i) flut2[i] = TRUE;
if (flutter(flut1)) retval[0..size/2] = <recurse>check
if (flutter(flut2)) retval[size/2..size] = <recurse>check
}
平易な英語では、カスタード マップの各半分でフラッターを呼び出します。いずれかの半分が false を返した場合、その半分全体にはカスタードが含まれていません。それ以外の場合、半分の半分にアルゴリズムが再帰的に適用されます。もっとうまくやれるかどうかはわかりません。ただし、沼地がほとんどカスタードである場合、このアルゴリズムはちょっと不十分です。
アイデア 2:
int itsize = 1
bool[size] retval = ALLFALSE;
for (int pos = 0; pos < size;)
{
bool[size] nextval = ALLFALSE;
for (int pos2 = pos; pos2 < pos + size && pos2 < size; ++pos2) nextval[pos2] = true;
bool flut = flutter(nextval)
if (!flut || itsize == 1)
{
for (int pos2 = pos; pos2 < pos + size && pos2 < size; ++pos2) retval[pos2] = flut;
pos+=itsize;
}
if (flut) itsize = 1;
if (!flut) itsize*=2;
}
平易な英語では、カスタード マップの各要素に対してフラッターを 1 つずつ呼び出します。カスタードが見つからない場合、次の呼び出しは前の呼び出しの 2 倍の要素になります。これは二分探索に似ていますが、検索対象の項目数がわからないため一方向のみです。これがどれほど効率的かはわかりません。