日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法提高课-搜索-Flood fill算法-AcWing 1098. 城堡问题:flood fill、bfs 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目分析


來源:acwing

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

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

  • 由于墻用數字表示,分別是1,2,4,8正好對應的是二進制的某一位。所以直接通過二進制狀態壓縮來bfs。
  • flood fill模板題。 需要統計的是area和cnt(連通塊的個數),前者在bfs中入隊列的點的數目就是area;后者可以在main函數中來做,因為每進行一次bfs就是連通塊個數加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 ++];// 出隊的時候統計連通塊的個數,即房間面積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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。