算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs
生活随笔
收集整理的這篇文章主要介紹了
算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目分析
來源:acwing
分析:這道題還是flood fill算法的應用,不同點在于八個方向掃描,習慣性采用二重循環來掃描周圍的8個方向;其次,這里需要統計周圍比它高的和比它矮的,這點用bool變量來統計即可。
ac代碼
#include<bits/stdc++.h> #define x first #define y second using namespace std; const int N = 1010, M = N *N; typedef pair<int,int> PII; PII q[M]; int n; bool st[N][N]; int g[N][N];// BFS傳的是引用, void bfs(int sx, int sy, bool& has_higher, bool& has_lower){int hh = 0, tt = 0;q[0] = {sx, sy};st[sx][sy]= true;while( hh <= tt){PII t = q[hh ++];for(int i = t.x-1; i <= t.x +1; i ++)for(int j = t.y -1; j <= t.y +1; j++){if(i < 0 || i >= n || j < 0 || j >= n) continue;if( g[i][j] != g[t.x][t.y]){ // 這是周圍的// 周圍有個高的if( g[i][j] > g[t.x][t.y]) has_higher = true;// 周圍個矮的else has_lower = true;}// 這是連通塊else if( ! st[i][j]){q[ ++ tt] = {i,j};st[i][j] = true;}}} } int main(){cin >> n;int cnt = 0;for(int i = 0; i< n; i ++)for(int j = 0; j < n; j++)cin >> g[i][j];int peak = 0, valley = 0;for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)//對于每個未遍歷過的點,統計連通塊if(!st[i][j]){bool has_higher = false, has_lower = false;bfs(i, j, has_higher, has_lower);//周圍沒有更高的,則山峰++if(!has_higher) peak ++;//周圍沒有更矮的,則山谷++if(!has_lower) valley++;}cout << peak <<" " << valley << endl; }題目來源
https://www.acwing.com/problem/content/1108/
總結
以上是生活随笔為你收集整理的算法提高课-搜索-Flood fill算法-AcWing 1106. 山峰和山谷:flood fill、bfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法提高课-搜索-Flood fill算
- 下一篇: 算法提高课-搜索-最短路模型-AcWin