这让我想到了分而治之。也许是这样的(这是稍微损坏的伪代码。它可能有栅栏错误等):
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
}
用简单的英语来说,它在 custard 地图的每一半上调用颤振。如果任何一半返回 false,则整个一半没有奶油冻。否则,一半的一半具有递归应用的算法。我不确定是否可以做得更好。然而,如果沼泽大部分是奶油冻,这个算法就有点蹩脚了。
想法二:
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;
}
用简单的英语,它在 custard map 的每个元素上调用颤振,一次一个。如果它没有找到 custard,下一次调用的元素数量将是上一次调用的两倍。这有点像二分搜索,除了只在一个方向上,因为它不知道它正在搜索多少个项目。我不知道这有多有效。