DFS-floodfill

来源:互联网 发布:cocos2dx程序员 编辑:程序博客网 时间:2024/06/05 11:23

第一篇博客,写什么呢
就连通块吧!
选一道例题:https://www.luogu.org/problem/show?pid=1454
圣诞夜的极光
侵删
当然是DFS啦,dfs求连通块是最好的,思路就是先填第一个点,接着按一定的顺序向周围扩散,如果已被搜索过或以到达边界就不搜
也可以用来求迷宫中的两点是否联通

Cpp题解如下(已AC):

#include<iostream>#include<cstring>using namespace std;char a[105][105];bool s[105][105];//s为判断是否走过int n,m;int cnt=0;void dfs(int x,int y){    if(x>n||y>m)        return;    if(s[x][y]==1)        return;    if(a[x][y]!='#')        return;    s[x][y]=1;    dfs(x,y+2);    dfs(x-1,y+1);    dfs(x,y+1);    dfs(x+1,y+1);    dfs(x-2,y);    dfs(x-1,y);    dfs(x+1,y);    dfs(x+2,y);    dfs(x-1,y-1);    dfs(x,y-1);    dfs(x+1,y-1);    dfs(x,y-2);}int main(){    memset(s,0,sizeof(s));    memset(a,0,sizeof(a));    cin>>n>>m;    for(int i=1;i<=n;i++)        for(int j=1;j<=m;j++)            cin>>a[i][j];    for(int i=1;i<=n;i++)    {        for(int j=1;j<=m;j++)        {            if(s[i][j]==0&&a[i][j]=='#')            {                dfs(i,j);                cnt++;            }        }    }    cout<<cnt;    return 0;        }
原创粉丝点击