【发布时间】:2020-02-16 18:36:12
【问题描述】:
问题是找出一个单词在给定的 N x N 字母矩阵中出现的次数。我们可以从任何一个单元格移动到另一个相邻的单元格。第一行有一个整数 N,然后是一个 N x N 矩阵。下一行有 M(单词的大小),然后是要在矩阵中找到的字符串。
Input:
4
ABCD
ABCD
ABCD
ABCD
2
BC
Expected output:
10
我已经为此编写了以下代码,并使用递归来解决问题。函数 adj 使用它们的索引检查矩阵中的字符是否与前一个字符相邻。每当字符串完成时,函数检查都会增加计数。二维数组会检查已访问和未访问的元素。
我得到的输出为
OUPUT
1
编辑1:这个输出只是因为调试打印语句,所以if语句只被访问一次。这并不意味着在多次递归调用后计数变量为 1。
编辑 2:在 scanf 语句中不应该有 &。但输出仍然不是我们想要的。
编辑 3:
Another input
7
SHELDON
HSTYUPQ
EHGXBAJ
LMNNQQI
DTYUIOP
OZXCVBN
NQWERTY
7
SHELDON
Expected output:
5
My output - 1
编辑 4(已解决!):所以问题在于写没有。网格矩阵的列数为 500,将其更改为 5 就可以了!感谢@gsamaras
代码
#include <stdio.h>
int vis[500][500], count;
int adj(int a, int b, int c, int d) {
if((c == a - 1) && (d == b - 1)) {
return 1;
}
else if((c == a - 1) && (d == b)) {
return 1;
}
else if((c == a) && (d == b - 1)) {
return 1;
}
else if((c == a - 1) && (d == b + 1)) {
return 1;
}
else if((c == a + 1) && (d == b)) {
return 1;
}
else if((c == a + 1) && (d == b + 1)) {
return 1;
}
else if((c == a) && (d == b + 1)) {
return 1;
}
else if((c == a + 1) && (d == b - 1)) {
return 1;
}
else {
return 0;
}
}
void check(char grid[][500],int i, int j, int id, char word[], int n, int m) {
if(id == m) {
count++;
printf("%d\n", count); // just to debug
}
else {
for(int p = 0; p < n; p++) {
for(int q = 0;q < n; q++) {
if((grid[p][q] == word[id]) && (adj(i, j, p, q)) && (vis[p][q] != 1)) {
vis[p][q] = 1;
check(grid, p, q, id + 1, word, n, m);
vis[p][q] = 0;
}
}
}
}
}
int main() {
int n, m, id = 0;
char blank;
scanf("%d", &n);
scanf("%c", &blank);
char grid[n][n+1];
for(int i = 0; i < n; i++) {
scanf("%s", grid[i]);
grid[i][n] = '\0';
}
scanf("%d", &m);
char word[m+1];
scanf("%s", &word);
for(int i = 0; i < n; i++) {
for(int j = 0;j < n; j++) {
if(grid[i][j] == word[id]) {
vis[i][j] = 1;
check(grid, i, j, id + 1, word, n, m);
vis[i][j] = 0;
}
}
}
printf("%d\n", count);
return 0;
}
【问题讨论】:
-
正确的输出10怎么样?我快速扫了一眼,数了数 4。我错过了什么? ://
-
@gsamaras 你也可以对角数,对角线也是相邻的,所以还有 6 对也在那里
-
所以任何元素最多可以有 8 个可能的相邻字符
-
@pmg 不,vis 是维护哪个元素已被访问,因为我们不能多次访问任何字符,然后我在递归调用后再次将其设置为 0,所以它很重要
-
@gsamaras:这里不是 DV'er,而是 DV 发生了。最好投票选出您认为最合适的方式,然后继续前进。
标签: c arrays function recursion