Это что-то для поиска подстроки в 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, но мне нужно сначала заставить это работать.

0
hohenpaid 14 Апр 2020 в 19:26

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;
}
1
Craig Estey 14 Апр 2020 в 17:51