标签:
/* 大意: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