给一个匹配词说“坏”和单词“bird”,“cat”,“mug”,“thug”,“irk”,“kin”,“in”,“mad”,“md” 从单词列表中尝试形成匹配单词。每次在给定列表中使用单词时,您都会获得一个观点。无与伦比的信件会带来负面影响。所以我们的目标是在这场比赛中最大化积分。
"bad" = "bird" -> "ir" + "a" + 1 point
"ir" = "irk" - "k" + 1 point
"k" = "kin" - "in" + 1 point
"in" = "in" + 1 point
"a" = -1 point
总计= 3分。
找到一个算法(可能递归)以找到最佳分数。
我很遗憾从未评估的表达列表中找出,选择最佳的表达式来达到最佳分数。例如,在上面的例子中,如果我首先评估“a”而不是“ir”,我会得到不同的结果。
计划以这种方式实施(我相信LISP会以更清洁的方式做到这一点)
int max_score = 0;
//以expr_list开头包含一个元素,即match_word
int get_score(node *word_list, node *expr_list, int recursion_depth) {
int score = 0;
node *left_expr, *right_expr;
if(!word_list || recursion_depth > 5) {
return -list_size(expr_list);
}
else if (!expr_list) {
return 0;
}
word_list = find_next_unvisted(word_list);
while(expr_list) {
while(word_list) {
left_expr = elem_split_left(word_list, expr_list);
right_expr = elem_split_right(word_list, expr_list);
list_add(expr_list, left_expr);
list_add(expr_list, right_expr);
expr_list->visited = 1;
word_list->visited = 1;
prev_score = score;
score++;
score += get_score(find_next_unvisited(word_list), find_next_unvisited(expr_list), ++recursion_depth);
if(score > max_score) {
max_score = score;
}
else { /* start backtracking */
expr_list->visited = 0;
word_list->visited = 0;
// Undo elem split
list_delete(expr_list, left_expr);
list_delete(expr_list, right_expr);
score = prev_score;
}
word_list = find_next_unvisted(word_list);
}
expr_list = find_next_unvisited(expr_list);
}
free_list(word_list);
free_list(expr_list);
return max_score;
}