题目描述
输入一个m行n列的字符矩阵,统计字符“@”组成多少个八连块。如果两个字符“@”所在的格子相邻(横、竖或者对角线方向),即属于同一个八连块。
输入
多组输入
输入行数m,以及列数n。
然后输入*和@
1<=n,m<=100
输出
联通块个数
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
就是将a数组进行操作,把整个矩阵都遍历一遍,在每次进行计算时都从是@开始进行,然后每次进行时,就是一个块,当然,每次需要进行时,需要判断是否进行被纳入其他块了,这就需要a数组进行判断记录。
#include<bits/stdc++.h>
#define check(x,y) (x<0||y<0||x>=xx||y>=yy||mp[x][y]!='@'||a[x][y]!=0)
using namespace std;
const int N=1005;;
char mp[N][N];
int a[N][N];
int xx,yy;
void Find(int x,int y,int dep)
{
if(check(x,y))//剪枝,也是结束条件
return;
a[x][y]=dep;
for(int i=-1; i<=1; i++){//共8个方向,除了0,0,都遍历一遍,霸占土地
for(int j=-1; j<=1; j++){
if(i!=0||j!=0){
Find(x+i,y+j,dep);
}
}
}
}
int main()
{
while(cin>>xx>>yy){
int mCount=0;
memset(a,0,sizeof(a));
for(int i=0; i<xx; i++){
for(int j=0; j<yy; j++){
cin>>mp[i][j];
}
}
for(int i=0; i<xx; i++){
for(int j=0; j<yy; j++){
if(a[i][j]==0&&mp[i][j]=='@'){//当没有被纳入其他块,而且是@时,则出现新的领主,进行霸占探寻其他@,扩展自己土地
Find(i,j,++mCount);
}
}
}
cout<<mCount<<endl;
}
}