girl and cat
两遍DFS
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
char g[5]={"girl"},c[4]={"cat"};
int dx[4]={-1,0,0,1},dy[4]={0,-1,1,0}; // -1,0 0,-1 0,1 1,0 表示方向 左下右上
char map[1200][1200];
int n,m;
int ans1,ans2;
void dfsgirl(int i,int j,int cur)
{
if(cur==4)
{
ans1++;
return ;
}
for(int k=0;k<4;k++)
{
int x=i+dx[k];
int y=j+dy[k];
if(x<1 || y<1||y>m||x>n)continue;
if(map[x][y]==g[cur])
dfsgirl(x,y,cur+1);
}
}
void dfscat(int i,int j,int cur)
{
if(cur==3)
{
ans2++;
return ;
}
for(int k=0;k<4;k++)
{
int x=i+dx[k];
int y=j+dy[k];
if(x<1 ||y<1 ||x>n||y>m)continue;
if(map[x][y]==c[cur])
dfscat(x,y,cur+1);
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
ans1=0;
ans2=0;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>map[i]+1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(map[i][j]=='g')
dfsgirl(i,j,1);
if(map[i][j]=='c')
dfscat(i,j,1);
}
cout<<ans1<<" "<<ans2<<endl;
}
return 0;
}