标签:
/*
大意:R只能右下涂,B只能右上涂,G表示被两种颜色都涂了,问你至少涂多少次把它涂成这样,暴力枚举每种斜线从一个边界到另一个边界
做了半天最后被场外队友A了。
有好多要学习的地方
!!!看题仔细!!!
1.能简单开for循环的不要开while
2.ok判断能省很多代码量
3.想清楚dfs用来干什么~~不要乱开变得繁琐
4注意重复点不要多次进行DFS
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
char map[55][55];
int f_left, f_right;
int cnt, n ,m;
bool ok(int x, int y)
{
if(x < 0 || x >= n || y < 0 || y >= m)
return false;
return true;
}
void left(int x, int y)
{
if(ok(x, y)){
if(map[x][y] == ‘R‘ || map[x][y] == ‘G‘){
if(f_left == 0){
cnt++;
f_left = 1;
}
}
else f_left = 0;
left(x + 1, y + 1);
}
return;
}
void right(int x, int y)
{
if(ok(x, y)){
if(map[x][y] == ‘B‘ || map[x][y] == ‘G‘){
if(f_right == 0){
cnt++;
f_right = 1;
}
}
else f_right = 0;
right(x + 1, y - 1);
}
return ;
}
int main()
{
int T;
scanf("%d", &T);
while(T--){
memset(map, 0, sizeof(map));
cnt = 0;
scanf("%d", &n);
for(int i = 0 ; i < n; i++){
scanf("%s", map[i]);
m = strlen(map[i]);
}
for(int i = 0; i < n ; i++){
f_left = 0;
left(i, 0);
}
for(int i = 1; i < m ; i++){
f_left = 0;
left(0, i);
}
for(int i = 0; i < n; i++){
f_right = 0;
right(i,m-1);
}
for(int i = 0; i < m - 1 ; i++){
f_right = 0;
right(0, i);
}
printf("%d\n", cnt);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/zero-begin/p/4684249.html