hdoj 5319 Painter(模拟题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5319

思路分析:假设颜色R表示为1,颜色B表示为2,颜色G表示为3,因为数据量较小,采用暴力解法即可,即每次扫描对角线,看每条对角线需要画多少笔,统计所有对角线的笔数和即可;

代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int MAX_N = 50 + 10;
int map[MAX_N][MAX_N];

int Solve(int n, int m)
{
    // m 表示行, n表示列数
    int count = 0;
    bool flag = false;
    for (int k = m - 1; k >= 1 - n; -- k)
    {
        flag = false;
        for (int j = 0; j < n; ++ j)
        {
            int i = j + k;
            if (0 <= i && i < m && 0 <= j && j < n)
            {
                if (map[i][j] & 1)
                {
                    map[i][j] = map[i][j] - 1;
                    if (!flag)
                    {
                        flag = true;
                        count++;
                    }
                }  else if ((map[i][j] & 1) == 0 && flag)
                    flag = false;
            }
        }
    }
    flag = false;
    int t = m + n;
    for (int k = 0; k < t; ++ k)
    {
        flag = false;
        for (int j = 0; j < n; ++ j)
        {
            int i = -j + k;
            if (0 <= i && i < m && 0 <= j && j < n)
            {
                if (map[i][j] & 2)
                {
                    map[i][j] = map[i][j] - 2;
                    if (!flag)
                    {
                        flag = true;
                        count++;
                    }
                } else if ((map[i][j] & 2) == 0 && flag)
                    flag = false;
            }
        }
    }
    return count;
}

int main()
{
    int case_times;
    char str[MAX_N];
    int n, m;

    scanf("%d", &case_times);
    while (case_times--)
    {
        scanf("%d", &n);
        memset(map, 0, sizeof(map));
        for (int i = 0; i < n; ++ i)
        {
            scanf("%s", str);
            int len = m = strlen(str);
            for (int j = 0; j < len; ++ j)
            {
                if (str[j] == ‘.‘)
                    map[i][j] = 0;
                if (str[j] == ‘R‘)
                    map[i][j] = 1;
                if (str[j] == ‘B‘)
                    map[i][j] = 2;
                if (str[j] == ‘G‘)
                    map[i][j] = 3;
            }
        }

        int ans = Solve(m, n);
        printf("%d\n", ans);

    }
    return 0;
}
时间: 2024-12-15 20:37:37

hdoj 5319 Painter(模拟题)的相关文章

模拟+思维 HDOJ 5319 Painter

题目传送门 1 /* 2 题意:刷墙,斜45度刷红色或蓝色,相交的成绿色,每次刷的是连续的一段,知道最终结果,问最少刷几次 3 模拟+思维:模拟能做,网上有更巧妙地做法,只要前一个不是一样的必然要刷一次,保证是最小的,脑洞大 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 c

HDU 5319 Painter (模拟 脑洞题)

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, h

HDU 5319 Painter (模拟)

题意:一个画家画出一张,有3种颜色的笔,R.G.B.R看成'\',B看成'/',G看成这两种的重叠(即叉形).给的是一个矩阵,矩阵中只有4种符号,除了3种颜色还有'.',代表没有涂色.问最小耗费多少笔即可画成这副图? 思路:最小耗费就是斜着的可以一笔搞定,但是如果中间隔着'.'或者其他一种形状,则不能一笔,要变两笔.主要麻烦在矩阵不是正方形,而可能是长方形.其实只要按照其画法,从左上往右下方向画,逐个条斜线扫描即可.另一个方向'/'也是如此. 我看到模拟本来就不想敲,扫两遍矩阵,用了vector

HDU 4028 The time of a day STL 模拟题

暴力出奇迹.. #include<stdio.h> #include<iostream> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<set> #include<map> using namespace std; #define ll __int64 #define N 42 ll n,m,ans;

cf428c 模拟题

这题说的是给了 n个数然后又 k次 的交换任意位置的 数字的机会  计算最长的连续子序列的和 这要撸  模拟整个 过程 并不能就是算最长的递增序列 如果只是 找最长的 和序列的 话 会存在 很多问题 在替换的时候 每一个决策 都影响着 下一个决策  这样 存在谁与谁替换 这样的状态有 200!种    那就枚举每个区间这样就可以使得 我们所用替换方法得当  因为在替换中我们进行替换是对不同区间的 操作 比如 在替换序列之内的 数字的时候 其实操作的就是不同的区间 与外面的序列进行替换的时候 操作

TOJ1290 Poker Hands 模拟题

寒假期间抽空做的一道模拟题 难度不算大,把每种牌型分开处理,可以合并的步骤考虑合并. 代码比较丑陋,首次尝试Sport Programming的风格,结果搞了个不伦不类(手动笑哭) 1 #include <algorithm> 2 #include <bitset> 3 #include <cctype> 4 #include <complex> 5 #include <cstdio> 6 #include <cstring> 7 #

hdu 5641 King&#39;s Phone(暴力模拟题)

Problem Description In a military parade, the King sees lots of new things, including an Andriod Phone. He becomes interested in the pattern lock screen. The pattern interface is a 3×3 square lattice, the three points in the first line are labeled as

HDU 2414 Chessboard Dance(模拟题,仅此纪念我的堕落)

题目 模拟题也各种wa,我最近真的堕落了,,,,,智商越来越为负数了!!!!!!!! #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char mp[10][10]; int d=-1;//0shang,1xia,2zuo,3you int x,y;//weizhi int weizhi(int i,int j) { if(mp[i][j]=='<'){x=

HDU 4930 Fighting the Landlords(扯淡模拟题)

Fighting the Landlords 大意: 斗地主....   分别给出两把手牌,肯定都合法.每张牌大小顺序是Y (i.e. colored Joker) > X (i.e. Black & White Joker) > 2 > A (Ace) > K (King) > Q (Queen) > J (Jack) > T (10) > 9 > 8 > 7 > 6 > 5 > 4 > 3. 给你8种组合:1.