#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<vector>
#include<string.h>
#include<map>
#include<cmath>
#include<queue>
#define ll long long
#define INF 0x7fffffff
#define MAX 0x3f3f3f3f
#define maxn 100005
#define ull unsigned long long
using namespace std;
char f[1005][1005];
int n,m,num1,num2;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void dfs1(int x,int y){//girl
int xx,yy;
for(int i=0;i<4;i++){//四个方向
xx=x+dir[i][0];
yy=y+dir[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m)//未走过且能走且未越界
{
if(f[x][y]=='g'&&f[xx][yy]=='i')
dfs1(xx,yy);
if(f[x][y]=='i'&&f[xx][yy]=='r')
dfs1(xx,yy);
if(f[x][y]=='r'&&f[xx][yy]=='l')
num1++;
}
}
return;
}
void dfs2(int x,int y){//cat
int xx,yy;
for(int i=0;i<4;i++){//四个方向
xx=x+dir[i][0];
yy=y+dir[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m)//未走过且能走且未越界
{
if(f[x][y]=='c'&&f[xx][yy]=='a')
dfs2(xx,yy);
if(f[x][y]=='a'&&f[xx][yy]=='t')
num2++;
}
}
return;
}
int main(){
int i,j,t;
char c;
scanf("%d",&t);
while(t--){
num1=num2=0;
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
c=getchar();
while(c==' '||c=='\n')c=getchar();
f[i][j]=c;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(f[i][j]=='g')dfs1(i,j);
if(f[i][j]=='c')dfs2(i,j);
}
}
printf("%d %d\n",num1,num2);
}
return 0;
}
读入字符二维数组的时候注意空格和回车可能会不均匀,可以用while((a = getchar()) == ’ ’ || a == ‘\n’);的方法