Это что-то для поиска подстроки в 2-м массиве
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, но мне нужно сначала заставить это работать.
1 ответ
Хорошо, я сделал несколько ускорений и упрощений.
Нет необходимости в отдельном counting
[для письма слева направо и справа налево, по крайней мере], поскольку вы можете использовать wordidx
Кроме того, как только вы найдете совпадение во внутреннем цикле, нет необходимости продолжать его. И вы можете остановить внешний цикл раньше
Быстрее вычислить длину str1
вне вызова и передать length
в качестве аргумента. Кроме того, strlen
должен работать нормально.
Слева направо: j
не нужно проходить полностью до COLUMN - 1
, поскольку последние N слотов могут не совпадать, если недостаточно места в строке матрицы, чтобы заполнить оставшуюся длину строки.
Кроме того, это неопределенное поведение, потому что вы перейдете в следующую строку. Это было бы безвредно [но неверный результат], за исключением последней строки, где вы выйдете за конец всей матрицы.
Итак, я добавил 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;
}
Похожие вопросы
Новые вопросы
c
C - это язык программирования общего назначения, используемый для системного программирования (ОС и встраиваемых), библиотек, игр и кроссплатформенности. Этот тег следует использовать с общими вопросами, касающимися языка C, как это определено в стандарте ISO 9899 (последняя версия 9899: 2018, если не указано иное, а также для запросов, специфичных для версии, с c89, c99, c11 и т. Д.). C отличается от C ++ и не должен сочетаться с тэгом C ++ без разумной причины.