Хорошо, я сделал несколько ускорений и упрощений.
Нет необходимости в отдельном counting
[по крайней мере слева направо и справа налево], как вы можете использовать wordidx
Кроме того, как только вы найдете совпадение на внутренней l oop, нет необходимости продолжать его. И вы можете остановить внешнюю l oop рано
Это быстрее вычислить длину str1
вне вызова и передать length
в качестве аргумента. Кроме того, strlen
должно работать очень хорошо.
Слева направо нет необходимости от j
до go вплоть до COLUMN - 1
, так как последние N слотов могут не соответствует, если на строке матрицы недостаточно места для выполнения оставшейся длины строки.
Кроме того, это неопределенное поведение, поскольку вы перетекаете в следующую строку. Это было бы безопасно (но неверно), за исключением последней строки, где вы будете go за концом всей матрицы.
Итак, я добавил jmax
значение COLUMN - length
Справа налево немного сложнее. Трюк 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;
}