Алгоритм игры Word Hunting на C++

В настоящее время я пишу игру, которая находит введенное слово в матрице змеиными способами. Вот краткое описание игры.

Сначала пользователю будет предложено ввести имя файла, содержащего строки для создания матрицы. После создания пользователю будет предложено ввести слово для поиска в этой матрице. Поиск ведется только в направлении юга, востока и юго-востока. Если он находит слово, отображает координаты и показывает какое-то сообщение. Пример матрицы ниже:

m e r e t z
e x i t a v
p p w a b i
y u u b l l
a l l l a l
z k v e l o

Мне удалось найти в этой матрице такие слова, как «выход», но моя проблема — это такие слова, как «просто» или «стол». В моем алгоритме я могу искать только слова, которые не имеют одной и той же буквы в двух направлениях. Я не мог найти правильный способ сделать это.

Вот часть поиска моего кода.

bool Search(tmatrix<char>& m, tmatrix<int>& c, const string& w, int i, int j, int index)  // m is the matrix to search in  // w is the word  // i and j are coordinates of matrix {
if(m[i][j] == w[index])
{
    c[index][0] = i; // c matrix is to keep coordinates of words
    c[index][1] = j;

    if(index != w.length()-1)
    {
            if((i < m.numrows()-1) && (m[i+1][j] == w[index+1]))
                return Search(m, c, w, i+1, j, index+1);
            else if((j < m.numcols()-1) && (i < m.numrows()-1) && (m[i+1][j+1] == w[index+1]))
                return Search(m, c, w, i+1, j+1, index+1);
            else if((j < m.numcols()-1) && (m[i][j+1] == w[index+1]))
                return Search(m, c, w, i, j+1, index+1);
            else 
                return false;
    }
    else
        return true;
}
return false;

}

int main()
{
   bool IsFound = false;                    //to check whether the word is found or not in the matrix
            tmatrix<int> coord(word.length(), 2);   //another matrix to keep coordinates of found word's coordinates.
                                                    //it works with the index of words and the row index of matrix.

            for(int i = 0; i < m.numrows(); i++)
            {
                for(int j = 0; j < m.numcols(); j++)
                {
                    int index = 0;      //another variable to keep index number
                    IsFound = Search(m, coord, word, i, j, index);      //searches matrix for word and if found, makes IsFound's return value true
                    if(IsFound)
                    {
                        cout << "The word "<< word << " is found!\n";
                        cout << "Indices in which this word is found in the matrix are:\n";
                        for(; index < word.length(); index++)
                        {
                            cout << word[index] << ":\t" << coord[index][0] << "," << coord[index][1] << endl;
                        }
                        break;      //whenever it finds a match in matrix, it finishes search in loops
                    }
                }
                if(IsFound)
                    break;
            }
}

Он идет только в том направлении, которое впервые появляется в списке операторов if. Изменение else ifs на if у меня не сработало.


person hevele    schedule 05.03.2012    source источник


Ответы (2)


Просто добавьте дополнительную логическую матрицу, которая говорит, что это слово используется. Поэтому, прежде чем вызывать поиск, установите это логическое значение как недействительное и, прежде чем двигаться в этом направлении, проверьте, не используется ли он.

person Luka Rahne    schedule 05.03.2012
comment
Я не совсем понял, вы рекомендуете мне добавить дополнительную логическую матрицу перед вызовом функции поиска в основном или рекурсивным вызовом? - person hevele; 05.03.2012
comment
У вас есть проблема в том, что вам нужно знать, использовался ли char. Другой способ заключается в том, что вы также можете заменить char на null char или аналогичный, а затем вернуть его после возврата из рекурсии. - person Luka Rahne; 05.03.2012

void Search(tmatrix<char>& m, tmatrix<int>& c, const string& w, int i, int j, int index) {
if(m[i][j] == w[index])
{
    c[index][0] = i;
    c[index][1] = j;

    if(index != w.length()-1)
    {
            if((i < m.numrows()-1) && (m[i+1][j] == w[index+1]))
            {
                Search(m, c, w, i+1, j, index+1);
            }
            if((j < m.numcols()-1) && (i < m.numrows()-1) && (m[i+1][j+1] == w[index+1]))
            {
                Search(m, c, w, i+1, j+1, index+1);
            }
            if((j < m.numcols()-1) && (m[i][j+1] == w[index+1]))
            {
                Search(m, c, w, i, j+1, index+1);
            }
    }
    else
        IsFound = true;
} }

Изменение функции на это решило все мои проблемы. Спасибо за ваш комментарий, они меня вдохновили.

person hevele    schedule 10.03.2012
comment
Можете ли вы объяснить, что здесь произошло? Вы просто скопировали решение. Нет полезной информации на первый взгляд - person gmelodie; 11.09.2018