算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs
生活随笔
收集整理的這篇文章主要介紹了
算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目分析
來源:acwing
分析:找房間個數,也就是找連通的個數。
樣例畫出來的房間個數如下圖:其中’|‘ 和’-'不是墻,只有#是墻。
分析:這題不用建圖,直接bfs(flood fill)來做,求連通塊的個數,并且求每個連通塊中方塊的個數。
AC代碼
#include<bits/stdc++.h> #define x first #define y second using namespace std; const int N = 55, M = N * N; typedef pair<int, int> PII; int n,m; int g[N][N]; PII q[M]; bool st[N][N];int bfs(int sx, int sy){int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1 , 0};int hh = 0, tt = 0;int area = 0;q[hh] = {sx, sy};st[sx][sy] = true;while( hh <= tt){PII t = q[ hh ++];// 出隊的時候統計連通塊的個數,即房間面積area ++;for(int i = 0; i < 4; i ++){int a = t.x + dx[i], b = t.y + dy[i];if( a < 0 || a >= n || b < 0 || b >= m) continue;if( st[a][b]) continue;// 如果有墻,過不來// 因為用1,2,4,8表示四面墻,對應的就是二進制位哪一位為1// g[t.x][t.y] >> i & 1 表示從(t.x,t.y)沿著i方向到(a,b)有墻if( g[t.x][t.y] >> i & 1) continue;// 符合條件,即連通塊,入隊列q[ ++ tt] = {a,b};st[a][b] = true;}}return area; // 返回面積大小 }int main(){cin >> n >> m;for(int i = 0; i < n; i ++)for(int j = 0; j < m; j++)cin >> g[i][j];int cnt = 0, area = 0;for(int i = 0; i < n; i ++)for(int j = 0; j< m; j++)if(!st[i][j]){area = max(area, bfs(i, j));cnt ++; // 統計連通塊的個數}cout << cnt << endl << area <<endl; }題目來源
https://www.acwing.com/problem/content/1100/
總結
以上是生活随笔為你收集整理的算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法提高课-搜索-Flood fill算
- 下一篇: 算法提高课-搜索-Flood fill算