问题 C: 油田问题

题目描述
输入一个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;

    }


}

猜你喜欢

转载自blog.csdn.net/qq_43520913/article/details/106149116