Хотя вы можете уйти без рекурсии, если это чисто обучающее упражнение для рекурсии, вы можете попробовать DFS подход.Имейте точку входа, чтобы начать поиск (i,j)
, из каждой точки исчерпайте все возможные области, которые вы могли бы пройти, (i+1,j)(i-1,j)(i,j+1)(i,j-1)
.Каждый шаг рекурсии также проверяет, находитесь ли вы в пределах массива, который будет i < 0 || i >= rows || j < 0 || j >= cols || visited[i][j]
, который вы просто вернете в этот момент.
Обратите внимание на массив visited
.Таким образом, в каждой точке рекурсии может быть шанс, что вы вернетесь обратно в ту же ячейку, верно?это сделало бы бесконечное возвращение, чтобы избежать этого, вы отслеживаете, какие ячейки вы уже посетили, visited[i][j]
.Отметьте их.Каждый вызов recrusion отслеживает минимальный элемент, записанный по ссылке, который будет вашим минимальным элементом.
void findMinElement(vector<vector<int>>& array, int& minelement, int i, int j, vector<vector<bool>>& visited)
{
if(i < 0 || i >= array.size() || j < 0 || j >= array[0].size() || visited[i][j]) return;
minelement = min(minelement,array[i][j]); // is this the best minimum?
visited[i][j] = true; // done visiting this cell
//lets visits others
findMinElement(array, minelement, i+1, j, visited);
findMinElement(array, minelement, i-1, j, visited);
findMinElement(array, minelement, i, j+1, visited);
findMinElement(array, minelement, i, j-1, visited);
}
int main()
{
vector<vector<int>> array =
{
{9,8,6,4},
{13,4,6,11},
{3,8,3,100}
};
int minElement = INT32_MAX;
//same dimensions as array
vector<vector<bool>> visited(array.size(), vector<bool>(array[0].size(),false));
//start from (0,0)
findMinElement(array,minElement,0,0,visited);
cout << minElement;
}
Теперь это дает вам возможность начать поиск также из любого места в массиве.Это может быть немного, но это поможет вам решить многие проблемы в дальнейшем.