【问题标题】:Search a 4x4 board of characters for words in the dictionary在 4x4 字符板上搜索字典中的单词
【发布时间】:2015-11-22 00:49:25
【问题描述】:

这是 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("%s\n", word);
        }
        word[strlen(word)]=boggleBoard[row][column];
        usedLetters[row][column]=1;
        //printf("%d\t%d\t%s\n", 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;
    }
}

【问题讨论】:

  • 调试提示:添加一个额外的参数int depth,在初始调用中为0,并将depth + 1传递给递归调用。在函数的顶部,打印depth 空格或制表符,后跟rowcolumn。这样,您可以看到您的递归如何在网格中移动,这将有助于跟踪错误的移动。
  • word[strlen(word)]=boggleBoard[row][column]; 之后,word 不是以空值结尾的,但您继续将其传递给函数并使用 strlen(word)

标签: c boggle


【解决方案1】:

您没有在此处发布足够的代码来实际测试这一点,但在我看来,您的重复问题源于您检查字典中是否存在一个词在添加之前从当前方块到当前单词的字母。现在写代码的方式,看起来每个匹配的单词都会被“添加”(打印?)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("%s\n", word);
        }
        //printf("%d\t%d\t%s\n", 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 ***/
}

我没有发现任何明显的错误会导致您的“跳跃”问题。

【讨论】:

  • 感谢您的意见!如果我发布其余代码会有帮助吗?我怕会太长。
  • @IrynaProtasova - 我认为你应该按照 Aasmund 上面的建议来帮助调试你的“跳跃”问题。发布DXDY 的定义可能会有所帮助。从您的 printf("%d\t%d\t%s\n", row, column, word); 输出中发布特定跟踪(您可以在其中看到“跳转”行为)也是一个很好的诊断方法。
  • const int D_SIZE = 8;常量 int DX[] = {-1,-1,-1,0,0,1,1,1};常量 int DY[] = {-1,0,1,-1,1,-1,0,1};它们是我用来快速访问某个位置周围的每个位置的数组。 0 0 mac 0 2 mas 0 1 a 0 0 ac 1 0 ac 1 0 0 0 c 0 2 s 0 2 s 0 1 sa 0 0 sac 1 0 sac 1 0 s 0 0 sc 3 0 r 2 0 ri 1 0 ri 0 0 ric 0 1 ria 0 2 rias 1 1 rim 从板:case mopi stre napd
【解决方案2】:

好的,我想通了。不过,这实际上是程序其余部分的问题。我将每一行板(传递给函数的参数)设置为 SIDELENGTH+1 的长度,因为我想为结束字符串字符保留一个空格,但我不需要那个。实际上,我不确定这是如何导致该问题的,但如果它有效,那就没问题了。谢谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-05
    • 2021-05-19
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    相关资源
    最近更新 更多