这是用于在2d数组中搜索子字符串的东西
int left_to_rigth(char matrix[ROW][COLUNM], char str1[])
{
int i = 0, j, counting = 0, wordcnt;
int length = computeLength(str1); //returns legth of string
int index = -1;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COLUNM; j += 1)
{
if (matrix[i][j] == str1[0])
{
for (wordcnt = 0; wordcnt < length; wordcnt++)
{
if (matrix[i][j + wordcnt] == str1[wordcnt])
{
counting++;
}
}
if (counting == length)
{
index = (i *12) + j;
}
}
}
}
return index;
}
输出:
Enter the string to be searched in the puzzle:
SHOUT
position in the puzzle: 12
PUZZLE(MATRIX)
X T Z M Q Y K C E C F H -->0 1 2 3 4 5 6 7 8 9 10 11
*S H O U T* E X O E A P I -->12 13 14 ------------23
X G T L Q B E L T N F K
A I R I D Z A L L I O D
M E I E T Y S E H R T I
A W B R N E T C W O H X
N O U I R U Z T S C C T
U D T P E C J I E H R U
A L E M C S Y O N I U R
L V *K E R E M* N I P H E
E A N B U R E J O N C Y
A W I I I J N J R U Y F
D W T N T H E N P J Y T
E Q L Z D I L E M M A B
R C I T E N G A M T P C
因此,函数返回SHOUT的起始点,即12,但当我试图搜索单词KEREM时,它应该给我110,但它返回-1,表示该单词不存在。代码似乎只搜索前3行,之后我输入的每个输入都返回-1。你能帮帮我吗我是个初学者这只是我需要做的第一部分,这样它就可以在每个方向上搜索。我可以写4个单独的函数,如果它们不返回-1,就可以调用它们,但我需要首先让工作
好的,我已经做了一些加速和简化。
不需要单独的counting
[至少从左到右和从右到左],因为您可以使用wordidx
此外,一旦你在内环上找到匹配,就没有必要继续。而且,你可以提前停止外环
计算调用外部str1
的长度并将length
作为参数传递会更快。此外,strlen
应该可以正常工作。
从左到右,j
不需要一直到COLUMN - 1
,因为如果矩阵行上没有足够的空间来满足剩余的字符串长度,则最后N个时隙可以不匹配。
此外,这是未定义的行为,因为您将溢出到下一行。这将是无害的[但错误的结果],除了最后一行,您将超越整个矩阵的末尾。
因此,我添加了COLUMN - length
的jmax
值
从右到左稍显棘手。jmax
技巧至关重要。
所以,这里有两个函数[它们编译得很干净,但我没有测试过它们]:
#include <string.h>
#define ROW 10
#define COLUMN 10
int
left_to_right(char matrix[ROW][COLUMN], const char *str1, int length)
{
char *matcur;
int i;
int j;
int wordidx;
int jmax = COLUMN - length;
int index = -1;
jmax += 1;
for (i = 0; i < ROW; ++i) {
for (j = 0; j < jmax; ++j, ++matcur) {
matcur = &matrix[i][0];
if (matcur[0] != str1[0])
continue;
for (wordidx = 1; wordidx < length; ++wordidx) {
if (matcur[wordidx] != str1[wordidx])
break;
}
if (wordidx == length) {
index = (i * COLUMN) + j;
break;
}
}
if (index >= 0)
break;
}
return index;
}
int
right_to_left(char matrix[ROW][COLUMN], const char *str1, int length)
{
const char *matcur;
int i;
int j;
int wordidx;
int jmax = COLUMN - length;
int index = -1;
for (i = 0; i < ROW; ++i) {
matcur = &matrix[i][jmax];
for (j = jmax; j >= 0; --j, --matcur) {
if (matcur[0] != str1[0])
continue;
for (wordidx = 0; wordidx < length; ++wordidx) {
if (matcur[wordidx] != str1[wordidx])
break;
}
if (wordidx == length) {
index = (i * COLUMN) + j;
break;
}
}
if (index >= 0)
break;
}
return index;
}