题解
2023-09-13 17:38:17
发布于:广东
68阅读
0回复
0点赞
首先简单的分析问题,就是求独立水洼的个数。一个水单元八个方向只要有一个是水单元,则这两块水是连接的。
特别典型的搜索题目
搜索怎么搜呢?
大部分人的想法是
DFS,如果vis数组八个方向都是false,cnt++
可以是可以,不过按照一般思路来写是
0分
那我们转变一种思路,先把vis数组中每个W标记为true,遍历数组地图,每找到一个true,那就对这个格子进行dfs(或bfs),来把这个范围内的所有true标记成false,每执行完一次,cnt++,下面是bfs的代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,cnt=0;
char a[10010][10010];
bool vis[10010][10010];
int d[8][2] = {{1,0},{0,1},{-1,0},{0,-1},{-1,1},{1,-1},{1,1},{-1,-1}};
struct Point
{
int x,y;
};
void bfs(Point l)
{
queue<Point> q;
vis[l.x][l.y] = false;
q.push(l);
while(q.size())
{
Point c = q.front();
q.pop();
for(int i=0;i<8;i++)
{
Point afterthat = {c.x+d[i][0], c.y+d[i][1]};
if(afterthat.x>0&&afterthat.x<=n&&afterthat.y>0&&afterthat.y<=m&&vis[afterthat.x][afterthat.y])
{
q.push(afterthat);
vis[afterthat.x][afterthat.y] = false;
}
}
}
cnt++;
}
void fillit()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(vis[i][j])
{
bfs({i,j});
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
if(a[i][j]=='W') vis[i][j]=true;
}
}
fillit();
cout<<cnt;
}
完美AC。
这里空空如也
有帮助,赞一个