题目解读:‘*’和‘ ’均为障碍物,小写字母即为药材,
要找到独立药材(非连通区域)的个数。
方法:DFS,利用标记数组vis[ ][ ],对于遍历的每一个元素,如果是未遍历过的药材,那就把它周围(上下左右4个方位)所有未遍历的药材标记一遍,深入遍历到底。
用到bool check(int x,int y)解决遍历到边界的问题。
直接上代码
#include<bits/stdc++.h>
using namespace std;
const int Maxn=1111;
string s[Maxn];
int vis[2021][2021];
int n;
int n_x[4]={0,0,1,-1};
int n_y[4]={1,-1,0,0};
bool check(int x,int y)
{
if(x>=1&&x<=n&&y>=0&&y<s[x].size()&&(s[x][y]>='a'&&s[x][y]<='z'))
return true;
else
return false;
}
void dfs(int x,int y,int a)
{
vis[x][y]=a;
for(int i=0;i<4;i++)
{
int xx=x+n_x[i];
int yy=y+n_y[i];
if(!vis[xx][yy]&&check(xx,yy))
dfs(xx,yy,a);
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<=n;i++)
{
getline(cin,s[i]);
}
memset(vis,0,sizeof(vis));
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<s[i].size();j++)
{
if(!vis[i][j]&&(s[i][j]>='a'&&s[i][j]<='z'))
{
sum++;
dfs(i,j,sum);
}
}
}
cout<<sum<<endl;
return 0;
}