Это заставляет меня думать о разделяй и властвуй. Может быть, что-то вроде этого (это слегка сломанный псевдокод. Может иметь ошибки пост-забора и т.п.):
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
}
На простом английском языке он вызывает флаттер на каждой половине карты заварного крема. Если любая половина возвращает ложь, то у всей этой половины нет заварного крема. В противном случае к половине половины применяется алгоритм рекурсивно. Я не уверен, что это возможно сделать лучше. Тем не менее, этот алгоритм отчасти хромает, если болото в основном заварной крем.
Идея вторая:
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;
}
На простом английском языке он вызывает флаттер на каждом элементе карты заварного крема, по одному за раз. Если это не находит заварной крем, следующий вызов будет на вдвое больше элементов, чем предыдущий вызов. Это похоже на бинарный поиск, за исключением только в одном направлении, поскольку он не знает, сколько элементов он ищет. Я понятия не имею, насколько это эффективно.