其实这题看清题意的话就会知道并不存在什么最优,只要找到一个方向暴力往下扫就行了,然后加上标记
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=1000000;
char s[56][1000],dp[56][1000],db[56][1000];
int dir[4][2]={1,1,-1,-1,1,-1,-1,1};
void dfs(int x,int y,int z,int fa)
{
int nx,ny;
if(z!=1)
for(int i=2;i<4;i++)
{
nx=x+dir[i][0];
ny=y+dir[i][1];
if((s[nx][ny]=='B'||s[nx][ny]=='G')&&db[nx][ny]==0&&nx!=fa)
{
dfs(nx,ny,z,x);
db[nx][ny]=1;
}
}
if(z!=2)
for(int i=0;i<2;i++)
{
nx=x+dir[i][0];
ny=y+dir[i][1];
if((s[nx][ny]=='G'||s[nx][ny]=='R')&&dp[nx][ny]==0&&nx!=fa)
{
dfs(nx,ny,z,x);
dp[nx][ny]=1;
}
}
}
int main()
{
int t,i,j,n,sum;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum=0;
memset(dp,0,sizeof(dp));
memset(db,0,sizeof(db));
memset(s,'.',sizeof(s));
for(i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(i=1;i<=n;i++)
{
for(j=1;s[i][j]!='\0';j++)
{
if(s[i][j]=='R'&&dp[i][j]==0)
{
sum++;
dp[i][j]=1;
dfs(i,j,1,-1);
}
if(s[i][j]=='B'&&db[i][j]==0)
{
sum++;
db[i][j]=1;
dfs(i,j,2,-1);
}
if(s[i][j]=='G')
{
if(db[i][j]==0)
{
sum++;
db[i][j]=1;
dfs(i,j,2,-1);
}
if(dp[i][j]==0)
{
sum++;
dp[i][j]=1;
dfs(i,j,1,-1);
}
}
}
}
printf("%d\n",sum);
}
return 0;
}