正经题解|全球变暖
2024-03-22 11:17:07
发布于:浙江
51阅读
0回复
0点赞
【算法分析】
可以去找寻每个连通块,看看是否连通块里有没有和海洋相邻的陆地,如果有则不会被淹没,否则反之。
【参考代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 9;
char MAP[maxn][maxn];
bool vis[maxn][maxn];
int n;
struct node {
int x, y;
}l, r;
int dir[4][2] = { -1,0,0,1,1,0,0,-1 };
bool bfs(int x, int y) {
queue<node> q; //存储位置的队列
q.push({ x,y }); //起始点放进队列
vis[x][y] = 1; //标记起始点访问过
bool flag = true; //表示是否会淹没,true表示会淹没
while (q.size()) {
r=q.front();
q.pop();
bool f = false; //表示r周围是否有海洋
for (int i = 0; i < 4; i++) {
l.x = r.x + dir[i][0], l.y = r.y + dir[i][1];
if (l.x >= 1 && l.x <= n && l.y >= 1 && l.y <= n) {
if (MAP[l.x][l.y] == '.') f = true;
}
}
if (!f) {
flag = false; //不会被淹没,这里不能直接return,因为要将连通块里所有元素标记访问过。
}
for (int i = 0; i < 4; i++) {
l.x = r.x + dir[i][0], l.y = r.y + dir[i][1];
if (l.x >= 1 && l.x <= n && l.y >= 1 && l.y <= n && !vis[l.x][l.y] && MAP[l.x][l.y] == '#') {
vis[l.x][l.y] = 1;
q.push(l);
}
}
}
return flag;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> MAP[i] + 1;
}
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (!vis[i][j] && MAP[i][j] == '#') {
ans += bfs(i, j);//广搜出(i,j)所处的连通块
}
}
}
cout << ans;
return 0;
}
【时间复杂度】
【预计得分】
这里空空如也
有帮助,赞一个