В функции bool существуют (...), я полагаю, вам нужно сбрасывать массив vis 2d на каждой итерации.
Поскольку предыдущий поиск dfs, но безуспешно, это посещение может повлиять на следующий поиск.
А также некоторые предложения по улучшению, вы можете добавить условие c == 1 в
if (board [i] [j] == word [0] && vis [i] [j] == 0)
или внешняя область действия
, потому что нас интересует только, найдено слово или нет.
Мы должны избегать вызова рекурсивной функции, потому что это стоит очень дорого
================= *
Я прочитал Снова кодируйте и обнаружите, что функция dfs не является dfs и действует больше как bfs. Я предполагаю фундаментальную проблему оттуда.
А также существует проблема ограничения времени при посещении 4-х направлений.
- исправление dfs
В fuction dfs ваш исходный код похож на
void dfs(vector<vector<char>>& board, int i, int j, int m, int n, string &word, int k)
{
if(k==word.size())
{
c=1;
return;
}
if(i!=m-1&&board[i+1][j]==word[k]&&vis[i+1][j]==0)
{
vis[i+1][j]=1;
dfs(board,i+1,j,m,n,word,k+1);
}
if(j!=n-1&&board[i][j+1]==word[k]&&vis[i][j+1]==0)
{
vis[i][j+1]=1;
dfs(board,i,j+1,m,n,word,k+1);
}
......
Предположим, что у нас есть карта символов, подобная
\ 0 1 2
0 xab
1 c bb
, и мы нужно найти "abbb c"
, как вы можете видеть, мы можем найти "abbb c", посетив
(0, 1) -> (0, 2) - > (1, 2) -> (1, 1) -> (1, 0) [при условии, что верхний левый индекс равен (0, 0)]
, но, следуя вашему коду, вы сначала заходите вниз, поэтому ( 1, 1) помечен как посещение, поэтому вы не можете найти «abbb c»
, чтобы исправить это, вы сбросили отметку посещения, когда завершена рекурсия sh.
if(i!=m-1&&board[i+1][j]==word[k]&&vis[i+1][j]==0)
{
vis[i+1][j]=1;
dfs(board,i+1,j,m,n,word,k+1);
vis[i+1][j]=0; // this should add to every direction.
}
также Как я уже говорил, в существующей функции вы должны сбросить карту посещений при вызове dfs
ограничение по времени.
Невозможно остановить dfs, когда переменная c уже стала 1.
Например, вам повезло, и вы нашли слово по посещение ВНИЗ -> ВНИЗ -> ВНИЗ -> ВНИЗ.
Но согласно вашему коду программа должна перейти по следующему возможному пути ВПРАВО -> ~~~, ВВЕРХ -> ~~~, ВЛЕВО -> ~~~.
, чтобы избежать этого, вы должны вставить выражение возврата между вызовами рекурсии.
if(i!=m-1&&board[i+1][j]==word[k]&&vis[i+1][j]==0)
{
~~~
}
if (c == 1) return;
if(j!=n-1&&board[i][j+1]==word[k]&&vis[i][j+1]==0)
{
~~~
}
Это сокращает время, не вызывая ненужную рекурсию.