目录
深搜入门leetcode797
因为也是二刷,推的比较快
刷题之后的感悟,其实就是先把模板写上去了之后再在里面缝缝补补出题目要求
都比较模板,变通一下思路就能做出来
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
//x代表当前的节点
void dfs(vector<vector<int>>& graph,int x)
{
//终止条件是遍历到最后一个节点了
if(x==graph.size()-1)
{
result.push_back(path);
return;
}
//访问一个节点能到达的所有目标节点
for(int i=0;i<graph[x].size();i++)
{
//添加路径,下一个目标节点
path.push_back(graph[x][i]);
//深搜,每个里面都要dfs
dfs(graph,graph[x][i]);
//深搜退出需要pop节点
path.pop_back();
}
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
path.push_back(0);
dfs(graph,0);
return result;
}
};
广搜入门
广搜的搜索方式就适合于解决两个点之间的最短路径问题。
因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。
代码模板
int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四个方向
// grid 是地图,也就是一个二维数组
// visited标记访问过的节点,不要重复访问
// x,y 表示开始搜索节点的下标
void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {
queue<pair<int, int>> que; // 定义队列
que.push({x, y}); // 起始节点加入队列
visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点
while(!que.empty()) { // 开始遍历队列里的元素
pair<int ,int> cur = que.front(); que.pop(); // 从队列取元素
int curx = cur.first;
int cury = cur.second; // 当前节点坐标
for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历
int nextx = curx + dir[i][0];
int nexty = cury + dir[i][1]; // 获取周边四个方向的坐标
if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue; // 坐标越界了,直接跳过
if (!visited[nextx][nexty]) { // 如果节点没被访问过
que.push({nextx, nexty}); // 队列添加该节点为下一轮要遍历的节点
visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问
}
}
}
}
leetcode200 深搜和广搜
class Solution {
public:
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void bfs(vector<vector<char>>& grid,vector<vector<bool>>& visited,int x,int y)
{
queue<pair<int,int>> que;
que.push({x,y});
visited[x][y]=1;
while(!que.empty())
{
int x=que.front().first;
int y=que.front().second;
que.pop();
for(int i=0;i<4;i++)
{
int nextx=x+dir[i][0];
int nexty=y+dir[i][1];
if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())
{
continue;
}
if(!visited[nextx][nexty]&&grid[nextx][nexty]=='1')
{
que.push({nextx,nexty});
visited[nextx][nexty]=1;
}
}
}
}
void dfs(vector<vector<char>>& grid,vector<vector<bool>>& visited,int x,int y)
{
//四个方向遍历
for(int i=0;i<4;i++)
{
int nextx=x+dir[i][0];
int nexty=y+dir[i][1];
if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())
{
continue;
}
if(!visited[nextx][nexty]&&grid[nextx][nexty]=='1')
{
visited[nextx][nexty]=1;
dfs(grid,visited,nextx,nexty);
}
}
}
int numIslands(vector<vector<char>>& grid) {
int n=grid.size();
int m=grid[0].size();
vector<vector<bool>> visited(n,vector<bool>(m,0));
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!visited[i][j]&&grid[i][j]=='1')
{
ans++;
//dfs
//visited[i][j]=1;
//dfs(grid,visited,i,j);
//bfs
bfs(grid,visited,i,j);
}
}
}
return ans;
}
};
695
class Solution {
public:
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int bfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int x,int y)
{
int area=1;
queue<pair<int,int>> que;
que.push({x,y});
visited[x][y]=true;
while(!que.empty())
{
int curx=que.front().first;
int cury=que.front().second;
que.pop();
for(int i=0;i<4;i++)
{
int nextx=curx+dir[i][0];
int nexty=cury+dir[i][1];
if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())
{
continue;
}
if(!visited[nextx][nexty]&&grid[nextx][nexty]==1)
{
que.push({nextx,nexty});
visited[nextx][nexty]=1;
area++;
}
}
}
return area;
}
int maxAreaOfIsland(vector<vector<int>>& grid) {
int maxarea=0;
int n=grid.size();
int m=grid[0].size();
vector<vector<bool>> visited(n,vector<bool>(m,0));
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!visited[i][j]&&grid[i][j]==1)
{
maxarea=max(maxarea,bfs(grid,visited,i,j));
}
}
}
return maxarea;
}
};
1020
class Solution {
public:
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void dfs(vector<vector<int>>& grid,vector<vector<bool>>& visited,int x,int y)
{
for(int i=0;i<4;i++)
{
int nextx=x+dir[i][0];
int nexty=y+dir[i][1];
if(nextx<0||nexty<0||nextx>=grid.size()||nexty>=grid[0].size())
{
continue;
}
if(!visited[nextx][nexty]&&grid[nextx][nexty]==1)
{
visited[nextx][nexty]=1;
dfs(grid,visited,nextx,nexty);
}
}
}
int numEnclaves(vector<vector<int>>& grid) {
int n=grid.size();
int m=grid[0].size();
vector<vector<bool>> visited(n,vector<bool>(m,0));
//只需要遍历四个边
for(int i=0;i<n;i++)
{
if(!visited[i][0]&&grid[i][0]==1)
{
visited[i][0]=1;
dfs(grid,visited,i,0);
}
if(!visited[i][m-1]&&grid[i][m-1]==1)
{
visited[i][m-1]=1;
dfs(grid,visited,i,m-1);
}
}
for(int j=0;j<m;j++)
{
if(!visited[0][j]&&grid[0][j]==1)
{
visited[0][j]=1;
dfs(grid,visited,0,j);
}
if(!visited[n-1][j]&&grid[n-1][j]==1)
{
visited[n-1][j]=1;
dfs(grid,visited,n-1,j);
}
}
int ans=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(visited[i][j]==false&&grid[i][j]==1)
{
ans++;
}
}
}
return ans;
}
};
标签:图论,int,vector,grid,visited,nextx,nexty
From: https://www.cnblogs.com/liviayu/p/17956190