AOJ0118——Property Distribution(DFS)

来源:互联网 发布:https 443端口 编辑:程序博客网 时间:2024/06/17 14:54

题目链接


      题目意思就是会给你一个矩阵(最多 100 X 100),然后里面会有三类字符'@', '#', '*', 相邻的(即上下左右)且相同的字符算在一个连通块内,问总共有多少个这样的连通块?裸的DFS,对每种字符用一次DFS再统计总块数即可。


#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;char s[105][105]= {'\0'};int n, m;int movx[4]= {-1,0,1,0};int movy[4]= {0,1,0,-1};void dfs(int x,int y,char c){    for(int i=0; i<4; i++)    {        if(s[x+movx[i]][y+movy[i]]==c)        {            s[x+movx[i]][y+movy[i]]='.';            dfs(x+movx[i],y+movy[i],c);        }    }}int main(){    //freopen("in.in","r",stdin);    while(scanf("%d%d",&n,&m)!=EOF)    {        char c=getchar();        int ans=0;        if(n==0&&m==0)break;        for(int i=1; i<=n; i++)        {            for(int j=1; j<=m; j++)                scanf("%c",&s[i][j]);            c=getchar();        }        for(int i=1; i<=n; i++)            for(int j=1; j<=m; j++)                if(s[i][j]=='@')                {                    ans++;                    s[i][j]='.';                    dfs(i,j,'@');                }        for(int i=1; i<=n; i++)            for(int j=1; j<=m; j++)                if(s[i][j]=='#')                {                    ans++;                    s[i][j]='.';                    dfs(i,j,'#');                }        for(int i=1; i<=n; i++)            for(int j=1; j<=m; j++)                if(s[i][j]=='*')                {                    ans++;                    s[i][j]='.';                    dfs(i,j,'*');                }        printf("%d\n",ans);    }    return 0;}


0 0