八连块问题

2020-11-11  本文已影响0人  优劣在于己

题意:问有几个连着的块,注意:只要上下左右斜对角都是连着的,下面的例子就是n*m矩阵,‘ * ’代表空格,‘ # ’代表物体,计算物体有几大块

输入

5 5
****#
*#**#
##**#
###*#
##**#

输出

2
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define nmax 100
char pic[nmax][nmax];
int row=0,col=0,count=0;
int vis[nmax][nmax];//标记的作用,看看这一块有没有被访问过
int dx[]={-1,-1,-1,0,0,1,1,1};
int dy[]={-1,0,1,1,1,-1,0,1};//dx[]、dy[],横纵坐标的八个方向,要对着!
void dfs(int irow,int icol){
    if(irow<0||irow>=row||icol<0||icol>=col)return ;
    if(vis[irow][icol]==1||pic[irow][icol]=='*')return ;
    vis[irow][icol]=1;
    for(int t=0;t<8;t++)//八个方向,就好像下面注释的那八个一样
        dfs(irow+dy[t],icol+dx[t]);
    //dfs(irow-1,icor-1);dfs(irow-1,icor);dfs(irow-1,icor+1);
    //dfs(irow,icor-1);                   dfs(irow,icor+1);
    //dfs(irow+1,icor-1);dfs(irow+1,icor);dfs(irow+1,icor+1);
}
int main(){
    memset(pic,0,sizeof(pic));
    memset(vis,0,sizeof(vis));
    scanf("%d %d",&row,&col);
    for(int i=0;i<row;i++){
        scanf("%s",pic[i]);
    }
    for(int g=0;g<row;++g)
        for(int k=0;k<col;k++){
            if(vis[g][k]==0&&pic[g][k]=='#'){
                count++;
                dfs(g,k);
            }
        }
        printf("%d",count);
    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读