我已经做过这个很多次了。我使用递归深度优先树遍历可能变化的游戏树来完成。有一个更改的预算
k ,我用它来修剪树。有了这个程序,我首先将其运行k = 0,然后k = 1,然后k = 2,直到我要么找到一个命中,要么不想再继续了。
char* a = ;
char* b = ;
int na = strlen(a);
int nb = strlen(b);
bool walk(int ia, int ib, int k){
if (k < 0) return false;
if (ia == na && ib == nb) return true;
if (ia < na && ib < nb && a[ia] == b[ib] && walk(ia+1, ib+1, k)) return true;
if (ia < na && ib < nb && a[ia] != b[ib] && walk(ia+1, ib+1, k-1)) return true;
if (ia < na && walk(ia+1, ib, k-1)) return true;
if (ib < nb && walk(ia, ib+1, k-1)) return true;
return false;
}
为了解释Trie搜索而添加:
struct TNode {
TNode* pa[128];
};
void walk(TNode* p, char key[], char answer[], int i, int hdis){
if (p->pa[0] != null){
if (key[i] == '\0') printf("answer = %s, hdis = %d\n", answer, hdis);
}
for(char c = 1; c < 128; c++){
if (p->pa[c] != null){
answer[i] = c; answer[i+1] = '\0';
walk(p->pa[c], key, answer, i+1, (answer[i]==key[i] ? hdis : hdis+1));
}
}
}
现在,如果要将其限制在预算内,只需在hdis太大时拒绝下降即可。