算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs
生活随笔
收集整理的這篇文章主要介紹了
算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目分析
來(lái)源:acwing
分析:找房間個(gè)數(shù),也就是找連通的個(gè)數(shù)。
樣例畫(huà)出來(lái)的房間個(gè)數(shù)如下圖:其中’|‘ 和’-'不是墻,只有#是墻。
分析:這題不用建圖,直接bfs(flood fill)來(lái)做,求連通塊的個(gè)數(shù),并且求每個(gè)連通塊中方塊的個(gè)數(shù)。
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 ++];// 出隊(duì)的時(shí)候統(tǒng)計(jì)連通塊的個(gè)數(shù),即房間面積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;// 如果有墻,過(guò)不來(lái)// 因?yàn)橛?,2,4,8表示四面墻,對(duì)應(yīng)的就是二進(jìn)制位哪一位為1// g[t.x][t.y] >> i & 1 表示從(t.x,t.y)沿著i方向到(a,b)有墻if( g[t.x][t.y] >> i & 1) continue;// 符合條件,即連通塊,入隊(duì)列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 ++; // 統(tǒng)計(jì)連通塊的個(gè)數(shù)}cout << cnt << endl << area <<endl; }題目來(lái)源
https://www.acwing.com/problem/content/1100/
總結(jié)
以上是生活随笔為你收集整理的算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 算法提高课-搜索-Flood fill算
- 下一篇: 算法提高课-搜索-Flood fill算