uva 527 Oil Deposits

图论入门题,找多少个八连块,简单的dfs解决

//给出一个m*n的矩阵,有些方格染色,一个方格的邻接方格有8个,就是它四周的八个
//一个染色的方格的邻接方格中也有染色的话那么把他们看做是一起的,都归为一个八连块
//题目要找这个矩阵中有多少个八连块
#include <stdio.h>
#include <string.h>
#define N 110
#define M 110
bool a[M][N],vis[M][N];
int m,n;

void dfs(int i , int j)
{
    if(!a[i][j] || vis[i][j]) return ;
    vis[i][j]=1;
    dfs(i-1,j-1);  dfs(i-1,j);   dfs(i-1,j+1);
    dfs(i,j-1);                  dfs(i,j+1);
    dfs(i+1,j-1);  dfs(i+1,j);   dfs(i+1,j+1);

    return ;
}
int main()
{
    int i,j,count;
    char s[M];
    while(1)
    {
        scanf("%d%d",&m,&n);
        if(!m) break;
        memset(vis,0,sizeof(vis));
        memset(a,0,sizeof(a));
        for(i=1; i<=m; i++)
        {
            scanf("%s",s+1);
            for(j=1; j<=strlen(s+1); j++)
                if(s[j]=='@')
                    a[i][j]=1;
        }
        
        for(j=0; j<=n+1; j++)  vis[0][j]=vis[m+1][j]=1;
        for(i=0; i<=m+1; i++)  vis[i][0]=vis[i][n+1]=1;
/*
        printf("打印a矩阵\n");
        for(i=1; i<=m; i++)
        {
            for(j=1; j<=n; j++)
                printf("%d",a[i][j]);
            printf("\n");
        }
        printf("打印vis矩阵\n");
        for(i=0; i<=m+1; i++)
        {
            for(j=0; j<=n+1; j++)
                printf("%d",vis[i][j]);
            printf("\n");
        }
*/
        for(count=0,i=1; i<=m; i++)
            for(j=1; j<=n; j++)
                if(a[i][j] && !vis[i][j])
                {
                    count++; 
                    dfs(i,j);
                }
        
        printf("%d\n",count);
    
    }
    return 0;
}
posted @ 2012-10-24 23:37  Titanium  阅读(227)  评论(0编辑  收藏  举报