zoukankan      html  css  js  c++  java
  • HDU5319 Painter

    问题链接:HDU5319 Painter

    本题可以使用深度优先搜索求解。

    红色刷子("R"刷子)按“”的方向刷,蓝色刷子("B"刷子)按"/"方向刷。一个地方如果被两次刷到变成绿色("G"色)。

    首先,忽略蓝色("B"色),只看红色("R"色),把绿色("G"色)也看成红色(因为需要用蓝色刷子刷一下),看最少需要用红色刷子刷几次;然后,忽略红色("R"色),只看蓝色("B"色),把绿色("G"色)也看成蓝色(因为需要用蓝色刷子刷一下),看最少需要蓝色刷子刷几次。将两个次数相加便是答案。

    AC的C语言程序如下:

    /* HDU5319 Painter */
    
    #include <stdio.h>
    #include <string.h>
    #include <memory.h>
    
    #define MAXN 50
    
    char grid[MAXN+1][MAXN+1];
    int visit[MAXN+1][MAXN+1];
    int n, m, ans;
    
    int nextrow(int row, int col)
    {
        return ((col + 1) % m == 0) ? row + 1 : row;
    }
    
    int nextcol(int col)
    {
        return (col + 1) % m;
    }
    
    void clear(int row, int col, char brush)
    {
        visit[row][col] = 1;
    
        if(brush == 'R') {
            row++;
            col++;
            while(row < n && col < m) {
                if(grid[row][col] == 'R' || grid[row][col] == 'G') {
                    visit[row][col] = 1;
                    row++;
                    col++;
                } else
                    break;
            }
        } else if(brush == 'B') {
            row++;
            col--;
            while(row < n && col >= 0) {
                if(grid[row][col] == 'B' || grid[row][col] == 'G') {
                    visit[row][col] = 1;
                    row++;
                    col--;
                } else
                    break;
    
            }
        }
    }
    
    void dfs(int row, int col, char brush)
    {
        for(;;) {
            if(row >= n)
                break;
    
            if(!visit[row][col] && (grid[row][col] == brush || grid[row][col] == 'G')) {
                ans++;
                clear(row, col , brush);
            }
    
            // 计算下一个位置
            row = nextrow(row,col);
            col = nextcol(col);
        }
    }
    
    int main(void)
    {
        int t, i;
    
        scanf("%d", &t);
        while(t--) {
            // 输入n
            scanf("%d", &n);
            getchar();
    
            // 输入数据
            for(i=0; i<n; i++)
                scanf("%s", grid[i]);
    
            // 计算列数
            m = strlen(grid[0]);
    
            // 深度优先搜索(刷过的清除)
            ans = 0;
            memset(visit, 0, sizeof(visit));
            dfs(0, 0, 'R');
            memset(visit, 0, sizeof(visit));
            dfs(0, 0, 'B');
    
            // 输出结果
            printf("%d
    ", ans);
        }
    
        return 0;
    }

    参考链接:Painter



  • 相关阅读:
    使用 requests 维持会话
    使用 requests 发送 POST 请求
    使用 requests 发送 GET 请求
    requests 安装
    使用 urllib 分析 Robots 协议
    使用 urllib 解析 URL 链接
    使用 urllib 处理 HTTP 异常
    使用 urllib 处理 Cookies 信息
    使用 urllib 设置代理服务
    按单生产程序发布
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7564594.html
Copyright © 2011-2022 走看看