/**
* 需求描述:
* 有一块N*M像素格的画板,初始状态空白,用‘X’表示
* 绘画规则为:每次选择一条斜线
* 如果斜线斜率为1,则选择一段格子,都涂为蓝色,用‘B’表示
* 如果斜线斜率为-1,则选择斜线中的一段格子,涂成黄色,用‘Y’表示
* 一个格子既涂成蓝色又涂成黄色,则变成绿色,用‘G’表示
* 已知一幅作品,求最少需要多少次操作完成这幅画
* *****************************************
* 输入:正整数N,M
* 画作:N行长度为M的字符串
*
*
* */
# include <stdio.h>
char str[60][60];
int m, n;
void dfs_Y(int x, int y){ //斜率-1,涂黄色Y
if (x >= 0 && x < n && y >=0 && y < m && (str[x][y] == 'Y' || str[x][y] == 'G')){
if(str[x][y] == 'G'){
str[x][y] = 'B';
}
else
{
str[x][y] = 'X';
}
dfs_Y(x - 1, y - 1);
dfs_Y(x + 1, y + 1);
}
return;
}
void dfs_B(int x, int y){ //斜率1,涂蓝色B
if(x >= 0 && x < n && 0 <= y && y <m && (str[x][y] == 'B' || str[x][y] == 'G')){
if (str[x][y] == 'G'){
str[x][y] = 'Y';
}
else
{
str[x][y] = 'X';
}
dfs_B(x + 1, y - 1);
dfs_B(x - 1, y + 1);
}
return;
}
int main(void){
int cnt;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
{
scanf("%s", str[i]);
}
cnt = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (str[i][j] == 'Y')
{
dfs_Y(i, j);
cnt++;
}
else if (str[i][j] == 'B')
{
dfs_B(i, j);
cnt++;
}
else if (str[i][j] == 'G')
{
dfs_Y(i, j);
str[i][j] = 'B';
dfs_B(i, j);
cnt += 2;
}
}
}
printf("%d\n", cnt); //无论初始str是什么图案,执行完计算过程之后str全变成'X'
//测试用:
// for (int i = 0; i < 4; i++)
// {
// for (int j = 0; j < 4; j++)
// {
// printf("%c", str[i][j]);
// }
// printf("\n");
// }
return 0;
}
/**
* 需求描述:
* 有一块N*M像素格的画板,初始状态空白,用‘X’表示