日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs

發(fā)布時(shí)間:2025/4/5 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目分析


來源:acwing

分析:找房間個(gè)數(shù),也就是找連通的個(gè)數(shù)。
樣例畫出來的房間個(gè)數(shù)如下圖:其中’|‘ 和’-'不是墻,只有#是墻。

分析:這題不用建圖,直接bfs(flood fill)來做,求連通塊的個(gè)數(shù),并且求每個(gè)連通塊中方塊的個(gè)數(shù)。

  • 由于墻用數(shù)字表示,分別是1,2,4,8正好對應(yīng)的是二進(jìn)制的某一位。所以直接通過二進(jìn)制狀態(tài)壓縮來bfs。
  • flood fill模板題。 需要統(tǒng)計(jì)的是area和cnt(連通塊的個(gè)數(shù)),前者在bfs中入隊(duì)列的點(diǎn)的數(shù)目就是area;后者可以在main函數(shù)中來做,因?yàn)槊窟M(jìn)行一次bfs就是連通塊個(gè)數(shù)加1.
  • 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;// 如果有墻,過不來// 因?yàn)橛?,2,4,8表示四面墻,對應(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; }

    題目來源

    https://www.acwing.com/problem/content/1100/

    總結(jié)

    以上是生活随笔為你收集整理的算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。