Недавно я прочитал об обнаружении циклов в графах с помощью dfs и решил реализовать его. Используя список смежности, мой код работал потрясающе, поэтому я решил решить реальную проблему, используя навыки. Вот задача, которую я выбрал. Но причина, по которой я оказался в SO, заключается в том, что мой код даже не может правильно решить примеры случаев и всегда, кажется, возвращает true (не очень странно, должно быть какая-то глупая ошибка...).
Что касается вопроса, подход, который я использовал, состоял в том, чтобы запустить dfs (поиск в глубину) и проверить, вернемся ли мы к посещенному узлу снова. Я запускаю исчерпывающий dfs, т.е. Я проверяю каждый непосещенный узел на предмет проверки. Чтобы убедиться, что расстояние между вершинами в неориентированном графе равно атласу 4, я отслеживаю рекурсивный стек и посещаемые уровни дерева pdf до самого узла в дереве (используя tmp_recursive_stack и recursion_stack, я интуитивно чувствую, что они являются корень проблемы) и наращивать прогресс, но, к счастью, код не работает. Ниже прикреплен код и тестовый пример, в котором он не работает.
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int n, m;
vector<string> matrice;
vector< vector<bool> > flag;
int recursion_stack = 0;
void dfs(int i, int j)
{
if(!flag[i][j])
{
flag[i][j] = true;
recursion_stack++;
int tmp_rec_stack = recursion_stack;
if(j > 0)
{
if(matrice[i][j] == matrice[i][j-1])
{
if(flag[i][j-1] && recursion_stack >= 3)
{
cout << "Yes\n"; exit(0);
}
dfs(i, j-1);
}
}
recursion_stack = tmp_rec_stack;
if(j < m-1)
{
if(matrice[i][j] == matrice[i][j+1])
{
if(flag[i][j+1] && recursion_stack >= 3)
{
cout << "Yes\n"; exit(0);
}
dfs(i, j+1);
}
}
recursion_stack = tmp_rec_stack;
if(i < n-1)
{
if(matrice[i][j] == matrice[i+1][j])
{
if(flag[i+1][j] && recursion_stack >= 3)
{
cout << "Yes\n"; exit(0);
}
dfs(i+1, j);
}
}
recursion_stack = tmp_rec_stack;
if(i > 0)
{
if(matrice[i][j] == matrice[i-1][j])
{
if(flag[i-1][j] && recursion_stack >= 3)
{
cout << "Yes\n"; exit(0);
}
dfs(i-1, j);
}
}
}
}
int main(void)
{
scanf("%d%d", &n, &m);
matrice.clear(); matrice.resize(n);
flag.clear(); flag.resize(n, vector<bool>(m, false));
for(int i = 0;i < n;i++) cin >> matrice[i];
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
if(!flag[i][j])
{
dfs(i, j);
recursion_stack = 0;
}
}
}
cout << "No\n";
}
Неудачный тестовый пример:
IN
3 4
AAAA
ABCA
AADA
Ожидаемый выход:
No
Мой выход:
Yes
main()
отвечал за вывод положительного результата. - person Arunas   schedule 19.03.2015dfs
, так как вы запускаете новую DFS из нового местоположения. - person Arunas   schedule 19.03.2015