我正在尝试做“令人吃惊的”游戏,我有一个带有字母的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);
}
最佳答案
让我们来看看如果它运行会发生什么:
对于每个起点,您都必须做同样的事情。例如(0,0)
checkword(mat,1,0,word,checker); ->(0,0)->标记为已选中
checkword(mat,2,0,word,checker); ->(1,0)->标记为已选中
checkword(mat,3,0,word,checker); ->(2,0)->标记为已选中
checkword(mat,4,0,word,checker); ->非法
Checkword(mat,3,1,word,checker); ->(3,0)->标记为已选中
这意味着您只需要在每个起点经过一条路径并检查合法字词即可。
您要做的就是从起点开始走每条路。您可以通过在完成所有递归路径后取消标记该字段为选中状态来实现此目的。
因此添加:
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';
}
关于c - 在C中运行多个递归函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47727624/