題目:https://leetcode.com/problems/number-of-islands/description/
dfs尋找聯通區域個數,使用遞歸會超時,要用棧模擬遞歸,代碼如下:
class Solution {
public:
void dfs(vector<vector<char>> grid,vector<vector<int>> &visited ,int i,int j){
visited[i][j] = 1;
stack<pair<int,int>>s;
s.push(make_pair(i,j));
while(!s.empty()){
pair<int,int> p = s.top();
s.pop();
i=p.first;
j = p.second;
visited[p.first][p.second] = 1;
if(i+1<grid.size()&&grid[i+1][j] == '1'&&visited[i+1][j]==0)
s.push(make_pair(i+1,j));
if(j+1<grid[0].size()&&grid[i][j+1] == '1'&&visited[i][j+1]==0)
s.push(make_pair(i,j+1));
if(i-1>=0&&grid[i-1][j]=='1'&&visited[i-1][j]==0)
s.push(make_pair(i-1,j));
if(j-1>=0&&grid[i][j-1] == '1'&&visited[i][j-1]==0)
s.push(make_pair(i,j-1));
}
}
int numIslands(vector<vector<char>>& grid) {
if(grid.size()==0) return 0;
int m = grid.size();
int n = grid[0].size();
int res = 0;
vector<vector<int>> visited(m,vector<int>(n,0));
for(int i = 0;i<m;++i){
for(int j=0;j<n;++j){
if(visited[i][j]==0&&grid[i][j]=='1')
{
res++;
dfs(grid,visited,i,j);
}
}
}
return res;
}
};