Painter
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 596 Accepted Submission(s): 278
Problem Description
Mr. Hdu is an painter, as we all know, painters need ideas to innovate , one day, he got stuck in rut and the ideas dry up, he took out a drawing board and began to draw casually. Imagine the board is a rectangle, consists of several square grids. He drew diagonally, so there are two kinds of draws, one is like ‘\’ , the other is like ‘/’. In each draw he choose arbitrary number of grids to draw. He always drew the first kind in red color, and drew the other kind in blue color, when a grid is drew by both red and blue, it becomes green. A grid will never be drew by the same color more than one time. Now give you the ultimate state of the board, can you calculate the minimum time of draws to reach this state.
Input
The first line is an integer T describe the number of test cases.
Each test case begins with an integer number n describe the number of rows of the drawing board.
Then n lines of string consist of ‘R’ ‘B’ ‘G’ and ‘.’ of the same length. ‘.’ means the grid has not been drawn.
1<=n<=50
The number of column of the rectangle is also less than 50.
Output
Output an integer as described in the problem description.
Output
Output an integer as described in the problem description.
Sample Input
2
4
RR.B
.RG.
.BRR
B..R
4
RRBB
RGGB
BGGR
BBRR
Sample Output
3
6
这题目主要还是读题的问题!题目意思一开始没有理解明白,一度以为是搜索题交了上去……其实涂色的时候只有两种方向:’\’的方向只有红色能涂,’/’的方向只有蓝色会涂,对于出现绿色的区域,既当成红色又当成蓝色就可以了。
对每个区域进行枚举,如果出现颜色区域的前一块没有颜色,那么必定是从这一块起笔开始刷的,最终答案数+1,这样就是下笔次数最少的情况。
#include <cstdio>
#include <cstring>
char s[55][55];
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%s", s[i] + 1);
int m = strlen(s[1] + 1);
int ans = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(s[i][j] == 'R' || s[i][j] == 'G')
if(!(s[i - 1][j - 1] == 'R' || s[i - 1][j - 1] == 'G'))
ans ++;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
if(s[i][j] == 'B' || s[i][j] == 'G')
if(!(s[i - 1][j + 1] == 'B' || s[i - 1][j + 1] == 'G'))
ans ++;
printf("%d\n", ans);
}
}