Прежде всего, for не имеет смысла, если вы нашли время, чтобы написать четыре разных if для соседей.Каждый из них будет выполнен один раз в любом случае.
void DFS(bool M[][COL], int row, int col)
{
static int depth = 0;
++depth;
if (depth > 3000)
{
--depth;
return;
}
M[row][col] = 0;
if (isSafe(M, row , col - 1) )
DFS(M, row , col - 1);
if (isSafe(M, row , col + 1) )
DFS(M, row , col + 1);
if (isSafe(M, row + 1, col) )
DFS(M, row + 1, col);
if (isSafe(M, row - 1 , col) )
DFS(M, row - 1, col);
--depth;
return;
}
Это должно сработать.Переменная глубины будет подсчитывать количество обращений к DFS, и каждый раз, когда она возвращается, вы уменьшаете значение. Однако это не лучший подход , потому что в некоторых случаях это может вызвать проблемы.Единственное, о чем я могу думать, это когда вы используете исключения.Потому что они выйдут из вашей функции и не уменьшат переменную глубины.
Другой подход - сохранить глубину в качестве параметра, но это делает функцию многословной для вызова.