// 基本的 DFS 框架:每次搜索四个相邻方格
void dfs(int[][] grid, int r, int c) {dfs(grid, r - 1, c); // 上边相邻dfs(grid, r + 1, c); // 下边相邻dfs(grid, r, c - 1); // 左边相邻dfs(grid, r, c + 1); // 右边相邻
}/*作者:nettee
链接:/ */
class Solution {
public:int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int maxAreaOfIsland(vector<vector<int>>& grid) {int m=grid.size(),n=grid[0].size();if(m==0||n==0) return 0;int maxArea=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]==1)maxArea=max(maxArea,dfs(grid,i,j));}}return maxArea;}int dfs(vector<vector<int>>& grid,int x,int y){if(grid[x][y]==0) return 0;grid[x][y]=0;//相当于已经访问int area=1;for(int i=0;i<4;i++){int tx=x+dx[i];int ty=y+dy[i];if(tx>=0&&tx<grid.size()&&ty>=0&&ty<grid[0].size()){area+=dfs(grid,tx,ty);}}return area;}
};
class Solution {
public:bool vis[205]={false};//表示还未被访问int findCircleNum(vector<vector<int>>& isConnected) {int n=isConnected.size();int cnt=0;for(int i=0;i<n;i++){if(vis[i]==false){cnt++;dfs(isConnected,i);}}return cnt;}void dfs(vector<vector<int>>& isConnected,int k){vis[k]=true;for(int i=0;i<isConnected.size();i++){if(isConnected[k][i]==1&&vis[i]==false) dfs(isConnected,i);}}
};
class Solution {
public:bool vis1[160][160]={false};//记录能流到太平洋的点bool vis2[160][160]={false};//记录能流到大西洋的点int dx[4]={0,0,-1,1};int dy[4]={1,-1,0,0};vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {int n=heights.size();int m=heights[0].size();vector<vector<int>> res;for(int i=0;i<n;i++){dfs1(heights,i,0);dfs2(heights,i,m-1);}for(int j=0;j<m;j++){dfs1(heights,0,j);dfs2(heights,n-1,j);}for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(vis1[i][j]&&vis2[i][j]){res.push_back({i,j});}}}return res;}void dfs1(vector<vector<int>>& heights,int x,int y){vis1[x][y]=true;for(int i=0;i<4;i++){int tx=x+dx[i];int ty=y+dy[i];if(tx>=0&&tx<heights.size()&&ty>=0&&ty<heights[0].size()&&heights[tx][ty]>=heights[x][y]&&vis1[tx][ty]==false) dfs1(heights,tx,ty);}}void dfs2(vector<vector<int>>& heights,int x,int y){vis2[x][y]=true;for(int i=0;i<4;i++){int tx=x+dx[i];int ty=y+dy[i];if(tx>=0&&tx<heights.size()&&ty>=0&&ty<heights[0].size()&&heights[tx][ty]>=heights[x][y]&&vis2[tx][ty]==false) dfs2(heights,tx,ty);}}
};
NOTE:回溯经常用于排列、组合、选择类问题
我用最为经典的方法做了…但效率不高。
class Solution {
public:vector<vector<int>> res;bool vis[15]={false};vector<vector<int>> permute(vector<int>& nums) {vector<int> temp;dfs(nums,0,temp);return res;}void dfs(vector<int>& nums,int index,vector<int> temp){if(temp.size()==nums.size()){res.push_back(temp);return;}for(int i=0;i<nums.size();i++){if(vis[i]==false){temp.push_back(nums[i]);vis[i]=true;dfs(nums,i+1,temp);temp.pop_back();vis[i]=false;}}}
};
本文发布于:2024-01-27 23:12:16,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063683353219.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |