题目链接:https://vjudge.net/problem/HDU-5706
题意:输入一个N*M的图,判断里面有多少个连续的Girl和cat,可以沿上下左右四个方向。
直接DFS或BFS就行。
#include<bits/stdc++.h>
#define maxn 1000010
#define LL long long
using namespace std;
int dx[4]={-1,0,1,0};
int dy[4]={0,-1,0,1};
char mp[1010][1010];
int ans1=0,ans2=0;
int n,m;
void dfs1(int x,int y)
{
if(mp[x][y]=='l')
{
ans1++;
return ;
}
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<0||nx>=n||ny<0||ny>=m)
continue;
if(mp[x][y]=='g'&&mp[nx][ny]=='i')
{
dfs1(nx,ny);
}
if(mp[x][y]=='i'&&mp[nx][ny]=='r')
{
dfs1(nx,ny);
}
if(mp[x][y]=='r'&&mp[nx][ny]=='l')
{
dfs1(nx,ny);
}
}
}
void dfs2(int x,int y)
{
if(mp[x][y]=='t')
{
ans2++;
return ;
}
for(int i=0;i<4;i++)
{
int nx=x+dx[i];
int ny=y+dy[i];
if(nx<0||nx>=n||ny<0||ny>=m)
continue;
if(mp[x][y]=='c'&&mp[nx][ny]=='a')
{
dfs2(nx,ny);
}
if(mp[x][y]=='a'&&mp[nx][ny]=='t')
{
dfs2(nx,ny);
}
}
}
int main()
{
int T;
while(cin>>T)
{
while(T--)
{
cin>>n>>m;
ans1=0,ans2=0;
for(int i=0;i<n;i++)
{
cin>>mp[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(mp[i][j]=='g')
dfs1(i,j);
if(mp[i][j]=='c')
dfs2(i,j);
}
}
cout<<ans1<<' '<<ans2<<endl;
}
}
return 0;
}