之前ACwing刷过 那个题是全球变暖 比这个难 直接bfs上代码。
const int N = 310;
typedef pair<int,int> PII;
int st[N][N];//判断是否遍历过
class Solution {
int ans=0;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
void bfs(int a,int b,vector<vector<char>>& grid)
{
queue<PII> q;//队列里应该存坐标
q.push({a,b});
st[a][b]=1;
while(!q.empty())
{
auto t =q.front();
q.pop();
int x=t.first,y=t.second;
for(int i=0;i<4;i++)
{
// x+=dx[i];
// y+=dy[i];//这里要注意我一开始这么写会直接把xy改掉
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<grid.size()&&ny>=0&&ny<grid[0].size()&&grid[nx][ny]=='1'&&!st[nx][ny])//注意边界条件的判断
{
q.push({nx,ny});
st[nx][ny]=1;
}
}
}
ans++;
}
public:
int numIslands(vector<vector<char>>& grid) {
int n=grid.size();
int m=grid[0].size();
memset(st,0,sizeof st);//这个初始化很关键 别忘了
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!st[i][j]&&grid[i][j]=='1') bfs(i,j,grid);
}
}
return ans;
}
};
心情是真的非常激动,第一次全程手撸没看题解。待会看题解看看有啥优化的方法,自己再思考一下深搜的做法。
记录一下调试出现的问题:
1. 没有memset初始化st数组
2.忘记考虑边界问题
3.dxdy直接赋值 有点不熟悉
法二:自己写一下深搜
代码:
const int N = 310;
int st[N][N];//判断是否遍历过
class Solution {
void dfs(int a,int b,vector<vector<char>>& grid)
{
st[a][b]=1;
//dfs也是四个方位分别深搜就可以了 只不过它会搜到底
if(a-1>=0&&!st[a-1][b]&&grid[a-1][b]=='1') dfs(a-1,b,grid);//↑
if(b+1<grid[0].size()&&!st[a][b+1]&&grid[a][b+1]=='1') dfs(a,b+1,grid);//→
if(b-1>=0&&!st[a][b-1]&&grid[a][b-1]=='1') dfs(a,b-1,grid);//←
if(a+1<grid.size()&&!st[a+1][b]&&grid[a+1][b]=='1') dfs(a+1,b,grid);//↓
}
public:
int numIslands(vector<vector<char>>& grid) {
int n=grid.size();
int m=grid[0].size();
int ans=0;
memset(st,0,sizeof st);//这个初始化很关键 别忘了
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(!st[i][j]&&grid[i][j]=='1')
{
dfs(i,j,grid);
ans++;
}
}
}
return ans;
}
};
深搜就不用队列,直接递归处理。