//给一个图,可以红色‘\‘这样刷,蓝色‘/‘这样刷,一个有两种颜色就变成黄色
//每次可以刷任意格子,给出最种状态,问最少需要刷几次
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std ;
const int maxn = 110 ;
char str[maxn][maxn] ;
int main()
{
int T ;
scanf("%d" ,&T) ;
while(T--)
{
int n ;
scanf("%d" ,&n) ;
for(int i = 0;i < n;i++)
scanf("%s" ,str[i]);
int m = strlen(str[0]) ;
int ans = 0;
for(int i = 0;i < m;i++){//str[i][j]右上角的特点是j-i为定值
int flag = 0 ;
for(int j = 0;i + j < m&&j<n;j++)
if((str[j][i+j] == ‘R‘||str[j][i+j]==‘G‘)&&!flag){ans++;flag = 1;}
else if(str[j][i+j] != ‘R‘&&str[j][i+j]!=‘G‘)flag = 0;
}
for(int i = 1;i < n;i++)//str[i][j]左下角的特点是i-j为定值
{
int flag = 0 ;
for(int j = 0;i+j < n && j < m;j++)
if((str[i+j][j] == ‘R‘||str[i+j][j]==‘G‘)&&!flag){ans++;flag = 1;}
else if(str[j+i][j] != ‘R‘&&str[j+i][j]!=‘G‘)flag = 0;
}
for(int i = 0;i < m ;i++)//str[i][j]左上角的特点i+j为定值
{
int flag = 0 ;
for(int j = 0;j <= i &&j < n;j++)
if((str[j][i-j] == ‘B‘||str[j][i-j] == ‘G‘)&&!flag){ans++;flag=1;}
else if(str[j][i-j] != ‘B‘&&str[j][i-j]!=‘G‘)flag = 0;
}
for(int i = 1;i < n;i++)//str[i][j]右下角的特点为i+j为定值
{
int flag = 0 ;
for(int j = 0;i + j < n && j < m;j++)
{
if((str[i+j][m-1-j] == ‘B‘||str[j+i][m-1-j] == ‘G‘)&&!flag){ans++;flag=1;}
else if(str[i+j][m-1-j]!=‘B‘&&str[j+i][m-1-j]!=‘G‘)flag = 0;
}
}
cout<<ans<<endl;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/cq_pf/article/details/47112343