八连块问题
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;
}