一开始提议理解错了 导致卡了半天 后来看了看讨论板知道了
矩形画布上画画
R(red)只能’\’方向涂
B(blue)只能’/’方向涂
一个位置R与B各一次变G 每个位置R与B各最多涂一次
从头便利 把画布还原白色即可知道涂了几笔
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#include <map>
#include <list>
#define INF 0x3f3f3f3f
#define esp 1e-8
using namespace std;
char str[55][55];
int n,l;
void runr(int x,int y)
{
++x,++y;
for(;x < n && y < l; ++x,++y)
{
if(str[x][y] == '.' || str[x][y] == 'B') return;
if(str[x][y] == 'G') str[x][y] = 'B';
else str[x][y] = '.';
}
}
void runb(int x,int y)
{
++x,--y;
for(;x < n && y >= 0; ++x,--y)
{
if(str[x][y] == '.' || str[x][y] == 'R') return;
if(str[x][y] == 'G') str[x][y] = 'R';
else str[x][y] = '.';
}
}
void rung(int x,int y)
{
runr(x,y);
runb(x,y);
}
int main()
{
int t,i,j,x,y,cnt;
scanf("%d",&t);
while(t--)
{
cnt = 0;
scanf("%d",&n);
for(i = 0; i < n; ++i)
{
scanf("%s",str[i]);
}
l = strlen(str[0]);
for(i = 0; i < n; ++i)
{
for(j = 0; j < l; ++j)
{
if(str[i][j] == 'R')
{
cnt++;
runr(i,j);
}
else if(str[i][j] == 'B')
{
cnt++;
runb(i,j);
}
else if(str[i][j] == 'G')
{
cnt += 2;
rung(i,j);
}
}
}
printf("%d\n",cnt);
}
return 0;
}