DFS实现floodfill算法
生活随笔
收集整理的這篇文章主要介紹了
DFS实现floodfill算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 題目:
- 分析與解答
- 題目:
題目:
多組案例,每組案例輸入一個m行n列的字符矩陣,統計字符‘@’組成多少個連通塊。如果兩個字符‘@’所在的格子相鄰(橫、豎或對角線),則說明它們屬于同一連通塊。
Sample Input
1 1*3 5*@*@***@***@*@*1 8@@****@*5 5****@*@@*@*@**@@@@*@@@**@0 0Sample Output
0122分析與解答
1.找到油田,然后通過循環遍歷他周圍的八個位置,不斷調用dfs函數,如果連通,則講連通分量標號
2.循環,找沒標記過的油田,然后繼續進行1,標號增加
3.油田均已標記完,此時輸出標號,就是連通塊個數
怎么寫bfs:
結束遞歸的條件有兩個,一個是超過了格子的范圍,另一個是之前曾經出現過,以及這個格子不是油田。找的話每個油田做標號,是同一聯通區域的標上一樣的號,最后輸出最終的標號即可。調用時機:if(idx[i][j]==0&&pic[i][j]==’@’)這個數沒標記過,而且屬于油田。bfs里面用兩個for循環直接把他八個方向都掃描了一遍,并且如果滿足條件就進行初始化,此時如果在同一個連通區域他們的值是相同的,所以main里調用bfs時一定是發現了不同的連通區域,如果要求不同連通區域個數,就只用在main里面更改cnt的個數
也可以寫八條DFS調用
#include<cstdio> #include <cstring> using namespace std; #define maxn 105 char a[maxn][maxn]; bool vis[maxn][maxn]; int n,m; void DFS(int x,int y) {if(x<0||x>=n||y<0||y>=m) return ;if(a[x][y]=='*'||vis[x][y]) return;vis[x][y]=true;DFS(x+1,y+1);DFS(x+1,y);DFS(x+1,y-1);DFS(x,y-1);DFS(x-1,y-1);DFS(x-1,y);DFS(x-1,y+1);DFS(x,y+1); } int main() {while(scanf("%d%d",&n,&m)!=EOF){if(n+m==0) break;for(int i=0; i<n; i++)scanf("%s",a[i]);int sum=0;memset(vis,false,sizeof(vis));for(int i=0; i<n; i++)for(int j=0; j<m; j++)if(!vis[i][j]&&a[i][j]=='@'){DFS(i,j);sum++;}printf("%d\n",sum);}return 0; }總結
以上是生活随笔為你收集整理的DFS实现floodfill算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arduino光敏+LED+数码管+蜂鸣
- 下一篇: (贪心)活动选择