HDU 5319 Painter (模擬 腦洞題)

_TCgogogo_發表於2015-07-28

Painter

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 133    Accepted Submission(s): 67


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
 
Source
 
題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=5319

題目大意:刷牆,只能按兩個斜45度刷,一個是紅色,一個是藍色,紅遇藍變綠,每個格子同種顏色只刷一次,每次刷必須是連續的一段,問答案目標狀態最少刷幾次

題目分析:按兩個方向列舉,\這種樣子刷,若當前點是紅或綠且斜前一個點不是紅且不是綠,則必然要刷一次,同理/這樣刷時也判斷一下,可是為什麼這樣算出來就是最小的呢,因為我只在必須要刷的時候才刷,所以顯然這樣就是最優的


#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);
    }
}



相關文章