(模拟队列)(bfs版flood fill算法)全球变暖

简介: (模拟队列)(bfs版flood fill算法)全球变暖

AcWing 1233. 全球变暖 - AcWing

套路:

lood fill搜索
前提条件:求图中连通块数量

我的思路

// // 1≤N≤1000一个整数表示答案。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没依照科学家的预测,照片中有多少岛屿会被完全淹没。

// count

// = ‘。’ is_bound = true;

// if true bound ++;

题解思路:

一个模拟队列(不必要),用一个PII数组模拟PII队列,用两个指针表示队列的front和backfront < back则size为0

push时back++,pop时front++;

函数维护两个值,在bfs外定义这两个值,然后通过引用传入函数中,实现在函数内改变函数外非堆变量的值的效果

题解思路妙在将题目给出的会被淹没的区块和不会被淹没的区块在图中的性质做对比,归结出两种区块的判断条件

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define x first
#define y second
const int N = 1e3 + 10;
char g[N][N];
bool st[N][N];
int n;
typedef pair<int,int>PII;
PII q[N*N];
int dx[] = {1,-1,0,0},dy[] = {0,0,1,-1};
void bfs(int x ,int y ,int &bound,int &count){
    q[0] = {x,y};
    st[x][y] = true;
    int ll = 0,rr = 0;
    while(ll <= rr){
        count ++;
        x = q[ll].x,y = q[ll].y;
        ll++;
        // cout << q[ll].x << " " << q[ll].y << endl;
        bool is_bound = false;
        for(int i = 0;i < 4;i++){
            int a =       x + dx[i];
            int b =       y + dy[i];
            if(st[a][b] ) continue;
            if(g[a][b] == '.'){
                is_bound = true;
                 continue;
            }
            if(a < 1 || a > n || b < 1 || b > n ) continue;
            q[++rr] = {a,b};
            st[a][b]= true;
        }
        if(is_bound) bound ++;
    }
}
int main(){
    cin >> n;
    for(int i = 1;i <= n;i++){
        scanf("%s",g[i]);
    }
    int cnt = 0;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= n;j++){
            if(g[i][j] == '#' &&!st[i][j]){
                int bound = 0,count = 0;
                bfs(i,j,bound,count);
                // cout << bound << " " << count  << endl;
                if(bound ==count) cnt++;
            }
        }
    }
    cout << cnt << endl;
    return 0;
}
目录
相关文章
|
1月前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
2月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
27 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
3月前
|
存储 算法 前端开发
深入理解操作系统:进程调度与优先级队列算法
【9月更文挑战第25天】在操作系统的复杂世界中,进程调度是维持系统稳定运行的核心机制之一。本文将深入探讨进程调度的基本概念,分析不同的进程调度算法,并着重介绍优先级队列算法的原理和实现。通过简洁明了的语言,我们将一起探索如何优化进程调度,提高操作系统的效率和响应速度。无论你是计算机科学的初学者还是希望深化理解的专业人士,这篇文章都将为你提供有价值的见解。
|
2月前
|
机器学习/深度学习 存储 算法
数据结构与算法——BFS(广度优先搜索)
数据结构与算法——BFS(广度优先搜索)
|
4月前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
4月前
|
存储 算法
BFS算法的实现
BFS算法的实现
55 1
|
4月前
|
算法
【数据结构与算法】优先级队列
【数据结构与算法】优先级队列
24 0
|
4月前
|
存储 算法
【数据结构与算法】队列(顺序存储)
【数据结构与算法】队列(顺序存储)
40 0
|
5月前
|
算法
数据结构与算法:栈与队列
数据结构与算法:栈与队列