Nano Hash - криптовалюты, майнинг, программирование

Найти текстовый путь через матрицу символов с помощью рекурсивного алгоритма

Я пытаюсь решить этот вопрос: http://www.spoj.com/problems/ALLIZWEL/< /а>

Найдите, есть ли в данной матрице путь, который образует предложение «ALL IZZ WELL».

Существует путь от любой ячейки ко всем соседним ячейкам.
Сосед может иметь общее ребро или угол.

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

Спецификация выходных данных:
Для каждого теста выведите «YES», если существует путь, который составляет предложение «ALLIZZWELL».
В противном случае выведите «NO».

Чтобы просмотреть примеры тестовых случаев, откройте ссылку.

Мой код:

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <utility>
#include <algorithm>
#include <stack>
#include <queue>
#include <climits>
#include <set>
using namespace std;

char matrix[101][101];
bool var;
int r,c;
bool check (string str,int pos, bool visited[101][101],int i, int j);
int main (void)
{
    int t,i,j;
    cin>>t;
    bool ans;
    while (t != 0)
    {
        int r,c,flag=0;
        cin>>r>>c;
        for ( i = 0; i < r; i++ )
        {
            for ( j = 0; j < c; j++ )
            {
                cin>>matrix[i][j];
            } 
        }
        string str = "ALLIZZWELL";
        int pos = 1;
        for ( i = 0; i < r; i++ )
        {
            for ( j = 0; j < c; j++ )
            {
                bool visited[101][101];
                for ( i = 0; i < 101; i++ )
                    for ( j = 0; j < 101; j++ )
                        visited[i][j] = false;
                visited[i][j] = true;
                if (matrix[i][j] == 'A') // for all possible starting positions
                ans = check(str,pos,visited,i,j); 
                if (ans == true)
                {
                    cout<<"YES\n";
                    flag = 1;
                    break;
                }
                if (flag == 1)
                    break;
            }
        }
        if (flag == 0)
            cout<<"NO\n";
        t--;
    }
    return 0;
}

bool check (string str,int pos, bool visited[101][101],int i, int j) // checking for all possible test cases
{
    bool result = false;
    if (pos == str.length() + 1)
        return true;
    if (i+1 < r && visited[i+1][j] != true && matrix[i+1][j] == str[pos])
    {
        visited[i+1][j] = true;
        result = result || check(str,pos+1,visited,i+1,j);
        if (result == false)
            visited[i+1][j] = false;
    }
    else if (i-1 >= 0 && visited[i-1][j] != true && matrix[i-1][j] == str[pos])
    {
        visited[i-1][j] = true;
        result = result || check(str,pos+1,visited,i-1,j);
        if (result == false)
            visited[i-1][j] = true;
    }
    else if (j+1 < c && visited[i][j+1] != true && matrix[i][j+1] == str[pos])
    {
        visited[i][j+1] = true;
        result = result || check(str,pos+1,visited,i,j+1);
        if (result == false)
            visited[i][j+1] = true;
    }
    else if (j-1 >= 0 && visited[i][j-1] != true && matrix[i][j-1] == str[pos])
    {
        visited[i][j-1] = true;
        result = result || check(str,pos+1,visited,i,j-1);
        if (result == false)
            visited[i][j-1] = true;
    }
    else if (i+1 < r && j+1 < c && visited[i+1][j+1] != true && matrix[i+1][j+1] == str[pos])
    {
        visited[i+1][j+1] = true;
        result = result || check(str,pos+1,visited,i+1,j+1);
        if (result == false)
            visited[i+1][j+1] = true;
    }
    else if (i+1 < r && j-1 >= 0 && visited[i+1][j-1] != true && matrix[i+1][j-1] == str[pos])
    {
        visited[i+1][j-1] = true;
        result = result || check(str,pos+1,visited,i+1,j-1);
        if (result == false)
            visited[i+1][j-1] = true;
    }
    else if (i-1 >= 0 && j+1 < c && visited[i-1][j+1] != true && matrix[i-1][j+1] == str[pos])
    {
        visited[i-1][j+1] = true;
        result = result || check(str,pos+1,visited,i-1,j+1);
        if (result == false)
            visited[i-1][j+1] = true;
    }
    else if (i-1 >= 0 && j-1 >= 0 && visited[i-1][j-1]!= true && matrix[i-1][j-1] == str[pos])
    {
        visited[i-1][j-1] = true;
        result = result || check(str,pos+1,visited,i-1,j-1);
        if (result == false)
            visited[i-1][j-1] = true;
    }
    return false;
}

Код говорит сам за себя: я пробую все возможные случаи.

Я получаю WA в третьем тестовом примере, т.е.

2 9
A.L.Z.E..
.L.I.W.L.

Я пробовал отлаживать, но не смог сузить свою проблему.


Ответы:


1

Основные проблемы:

  1. Использование i и j в очистке посещенного цикла (а также внешних циклов)
  2. Использование r и c в качестве глобальных переменных для проверки, но запись их в качестве локальных переменных в main
  3. Всегда возвращает false из проверки (вместо результата)
  4. Проверять только первый вариант (превратить «иначе, если» в «если»)
  5. Не очищая значение в ответе
  6. Только выход из внутреннего цикла, а не цикл i и j
  7. Прекращение поиска, когда pos доходит до str.length()+1 вместо str.length()

Часто бывает полезно поместить некоторые операторы печати в такие рекурсивные функции, опробовать их на простом примере и посмотреть, соответствует ли последовательность вызовов вашим ожиданиям.

30.10.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..