在C中运行多个递归函数

时间:2017-12-09 10:33:12

标签: c

我正在尝试进行“boggle”游戏,我有一个带字母的2D矩阵,我必须找到单词。 矩阵:包含以下字母:{{'C','A','R','T'},{'E','T','A','K'},{'E','S ','M','E'},{'L','L','P','N'}}; 输入:这个矩阵 输出:在矩阵中找到的所有单词,来自字典“isWord”。

代码应该采用矩阵,索引,索引,单词和布尔矩阵。 我所写的每一个字母都应该在bool矩阵中标记为true,然后我继续递归,直到它的出去长度。我每次都要走4条路。我不能只回去前进。 代码的主要问题是只在一个路径中运行而不是继续使用路径的休止符。 [呼吁“checkword”几次,似乎它坚持第一个命令]。

任何想法?在C.中很新。

#include <stdio.h>
        #include <string.h>
        #include <stdbool.h>
        bool isWord(char *s);

        void check(char mat[4][4]) {
            int i,j;
            int counter=0;
            for(i=0; i<4; i++) {
                for(j =0; j<4; j++) {
                    char str[12] = "";
                    //append(str, mat[i][j]);
                    bool checker[4][4]={{false}};
                    //printf("mat[%d][%d]: %s\n", i, j, str);
                    checkword(mat,i,j, str, checker);
                    counter++;
                     fflush(stdout);
                }
            }
        }
        void append(char* s, char c)
        {
                int len = strlen(s);
                s[len] = c;
                s[len+1] = '\0';
        }
        void checkword(char mat[4][4], int i, int j, char word[], bool checker[4][4]) 
        {
          if(i >= 0 && i<4 && j >= 0 && j < 4) 
          {
              if(!checker[i][j])
              {
                 // Mark current cell as visited and append current character
            // to str
            checker[i][j] = true;
            append(word, mat[i][j]);
            printf("%s\n", word);
            // If str is present in dictionary, then print it
            if (isWord(word))
                printf("Found word: %s\n", word);

            checkword(mat, i+1, j, word, checker); 
            checkword(mat, i, j+1, word, checker);
            checkword(mat, i, j-1, word, checker);
            checkword(mat, i-1, j, word, checker);
              }

         }
        }

        bool isWord(char* s) {
                return (!strcmp(s,"CAT") |
                    !strcmp(s,"CATS") |
                    !strcmp(s,"TRAM") |
                    !strcmp(s,"TRAMS") |
                    !strcmp(s,"TAME") |
                    !strcmp(s,"CAR") |
                    !strcmp(s,"CARS") |
                    !strcmp(s,"RAT") |
                    !strcmp(s,"RATS") |
                    !strcmp(s,"RAMP") |
                    !strcmp(s,"ART") |
                    !strcmp(s,"CART") |
                    !strcmp(s,"STAMP") |
                    !strcmp(s,"TAKEN") |
                    !strcmp(s,"MEN") |
                    !strcmp(s,"MAKE") |
                    !strcmp(s,"TAKE") |
                    !strcmp(s,"ATE") |
                    !strcmp(s,"SELL") |
                    !strcmp(s,"STEEL") |
                    !strcmp(s,"RAKE") );
        }



        int main() {
            char mat[4][4] = { {'C','A','R','T'}, {'E', 'T', 'A', 'K'}, {'E','S','M','E'}, {'L', 'L', 'P', 'N'} };
            check(mat);
         //   printf("Numbers of cells : %d", count);
        }

1 个答案:

答案 0 :(得分:0)

让我们了解一下如果它会运行会发生什么:

对于每个起点你都这样做。例如(0,0)

  1. checkword(mat,1,0,word,checker); - &GT; (0,0) - &gt;标记为已选中
  2. checkword(mat,2,0,word,checker); - &GT; (1,0) - &gt;标记为已选中
  3. checkword(mat,3,0,word,checker); - &GT; (2,0) - &gt;标记为已选中
  4. checkword(mat,4,0,word,checker); - &GT;非法
  5. checkword(mat,3,1,word,checker); - &GT; (3,0) - &gt;标记为已选中
  6. 这意味着您只需要在每个起点经过一条路径并检查合法的字词。

    你想要做的是从起点走下每条路。你可以通过在完成所有递归路径时将字段取消标记为已完成来实现此目的。

    添加:

    checkword(mat, i+1, j, word, checker); 
    checkword(mat, i, j+1, word, checker);
    checkword(mat, i, j-1, word, checker);
    checkword(mat, i-1, j, word, checker);
    checker[i][j]=false; // <-- clear path for other paths
    shortenByOne(word);
    

    编辑: 一旦你完成了,你也需要缩短这个词 - 我忘记了:

    void shortenByOne(char* s)
    {
            int len = strlen(s);
            if(len==0) return;
            s[len-1] = '\0';
    }