这是Boggle Board的C赋值。
任务是从一个瓦片开始,在任何一点向上、向下、向左、向右或对角移动,在一块4x4字符板上搜索字典中的单词。我的程序从一个点"跳"到另一个点,从不相邻的字母拼写单词,并多次添加单词。
void goToNextLetter(struct trie* dictionary, char boggleBoard[SIDELENGTH][SIDELENGTH], int usedLetters[SIDELENGTH][SIDELENGTH], char word[MAX], int row, int column){
int i, rowTemp, colTemp;
if (isPrefix(dictionary, word, 0)){
if (isInDictionary(dictionary, word, 0)){
printf("%sn", word);
}
word[strlen(word)]=boggleBoard[row][column];
usedLetters[row][column]=1;
//printf("%dt%dt%sn", row, column, word);
for (i=0; i<D_SIZE; i++){
rowTemp=row+DY[i];
colTemp=column+DX[i];
if ((rowTemp<SIDELENGTH) && (rowTemp>=0) && (colTemp>=0) && (colTemp<SIDELENGTH) && (usedLetters[rowTemp][colTemp]==0)){
goToNextLetter(dictionary, boggleBoard, usedLetters, word, rowTemp, colTemp);
}
}
//remove the last letter of word
word[strlen(word)-1] = 0;
usedLetters[row][column]=0;
}
}
您没有足够的代码发布在这里来实际测试这一点,但在我看来,您的重复问题源于这样一个事实,即在将当前正方形中的字母添加到当前单词之前,您要检查字典中是否有单词。按照现在编写代码的方式,看起来每个匹配的单词都会被"添加"(打印?)D_SIZE
次。。。
换句话说,您应该将更新word
/usedLetters
代码移动到条件语句的之外:
void goToNextLetter(struct trie* dictionary, char boggleBoard[SIDELENGTH][SIDELENGTH], int usedLetters[SIDELENGTH][SIDELENGTH], char word[MAX], int row, int column){
int i, rowTemp, colTemp;
/*** START HOISTED CODE ***/
word[strlen(word)]=boggleBoard[row][column];
usedLetters[row][column]=1;
/*** END HOISTED CODE ***/
if (isPrefix(dictionary, word, 0)){
if (isInDictionary(dictionary, word, 0)){
printf("%sn", word);
}
//printf("%dt%dt%sn", row, column, word);
for (i=0; i<D_SIZE; i++){
rowTemp=row+DY[i];
colTemp=column+DX[i];
if ((rowTemp<SIDELENGTH) && (rowTemp>=0) && (colTemp>=0) && (colTemp<SIDELENGTH) && (usedLetters[rowTemp][colTemp]==0)){
goToNextLetter(dictionary, boggleBoard, usedLetters, word, rowTemp, colTemp);
}
}
}
/*** START HOISTED CODE ***/
//remove the last letter of word
word[strlen(word)-1] = 0;
usedLetters[row][column]=0;
/*** END HOISTED CODE ***/
}
我看不出任何明显的错误会导致你的"跳跃"问题。
好吧,我想好了。不过,这实际上是程序其余部分的问题。我将板的每一行(传递到函数中的参数)设置为SIDELENGTH+1的长度,因为我想为结束字符串保留一个空格,但我不需要。事实上,我不确定这是怎么造成这个问题的,但如果它有效的话,那没关系。谢谢大家的帮助!