HDU 5319 Painter (模拟)

题意:一个画家画出一张,有3种颜色的笔,R、G、B。R看成‘\‘,B看成‘/‘,G看成这两种的重叠(即叉形)。给的是一个矩阵,矩阵中只有4种符号,除了3种颜色还有‘.‘,代表没有涂色。问最小耗费多少笔即可画成这副图?

思路:最小耗费就是斜着的可以一笔搞定,但是如果中间隔着‘.‘或者其他一种形状,则不能一笔,要变两笔。主要麻烦在矩阵不是正方形,而可能是长方形。其实只要按照其画法,从左上往右下方向画,逐个条斜线扫描即可。另一个方向‘/‘也是如此。

  我看到模拟本来就不想敲,扫两遍矩阵,用了vector将他们每一条可能可以一笔画的线先装起来,再进行扫vector进行统计。哎~其实可以直接扫两矩阵就统计的,就是懒。

#include <bits/stdc++.h>
using namespace std;
const int N=250;

char grid[N][N];
int n;
vector<int> R[N], B[N];

int cal(int col)
{
    int cnt=0;
    for(int i=1; i<=n; i++)//一个方向
    {
        for(int j=1; j<=col; j++)
        {
            if(grid[i][j]==‘R‘||grid[i][j]==‘G‘)
            {
                if(i>j)    R[i-j].push_back(1);
                else if(i<j)    R[j-i+100].push_back(1);
                else    R[0].push_back(1);
            }
            else
            {
                if(i>j)    R[i-j].push_back(0);
                else if(i<j)    R[j-i+100].push_back(0);
                else    R[0].push_back(0);
            }
        }
    }

    for(int i=0; i<N; i++)
    {
        int flag=0;
        for(int j=0; j<R[i].size(); j++)
        {
            if(!flag && R[i][j]==1)
            {
                cnt++;
                flag=1;
            }
            if(!R[i][j])    flag=0;
        }
    }

    for(int i=1; i<=n; i++)//另一方向
    {
        for(int j=col,k=1; j>=1; j--,k++)
        {
            if(grid[i][j]==‘B‘||grid[i][j]==‘G‘)
            {
                if(i>k)    B[i-k].push_back(1);
                else if(i<k)    B[k-i+100].push_back(1);
                else    B[0].push_back(1);
            }
            else
            {
                if(i>k)    B[i-k].push_back(0);
                else if(i<k)    B[k-i+100].push_back(0);
                else    B[0].push_back(0);
            }
        }
    }

    for(int i=0; i<N; i++)
    {

        int flag=0;
        for(int j=0; j<B[i].size(); j++)
        {
            if(!flag && B[i][j])
            {
                cnt++;
                flag=1;
            }
            if(!B[i][j])    flag=0;
        }
    }

    return cnt;
}

int main()
{
    //freopen("input.txt", "r", stdin);
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%d",&n);
        for(int i=0; i<N; i++)    R[i].clear(),B[i].clear();

        for(int i=1; i<=n; i++)    scanf("%s", grid[i]+1);
        printf("%d\n",cal(  strlen( grid[1]+1 ) ));
    }
    return 0;
}

AC代码

时间: 2024-11-07 22:29:32

HDU 5319 Painter (模拟)的相关文章

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(枚举)

Painter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 745    Accepted Submission(s): 345 Problem Description Mr. Hdu is an painter, as we all know, painters need ideas to innovate , one day,

hdu 5319 Painter

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5319 题意:给你一个正方形,一把刷子,两种刷色法. ' \' 表示沿对角刷成红色,"/" 表示沿对角刷成蓝色.蓝色红色交叉形成绿色: 问最少刷几次形成如图图案. 解法:从上到下未被刷过就直接刷. 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h&

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

模拟+思维 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(2015多校3)-Painter(dfs)

题目地址:HDU 5319 题意:给一个图n*m,原来全是点('.'). 现在要把图染成已给出的样子. 要求当是'\'的情况只用红色,是'/'的情况只用蓝色,当一个格子同时被红色和蓝色染得时候变成绿色.(每个格子只画一次). 思路:这题只要模拟一下刷的过程就行了,如果出现了R,就刷R刷到底,出现B就刷B,出现G就左右各刷一次. #include <stdio.h> #include <math.h> #include <string.h> #include <st

hdu 4964 Emmet(模拟)

题目链接:hdu 4964 Emmet 题目大意: 给定语句,按照语法翻译并输出. 解题思路:用递归模拟文法分析,主要注意几点: 括号并且的情况:(fuck)(you) 括号嵌套的情况:((fuck.you)) 优先输出id,然后是class(题目中有说) 乘法的部分:fuck*2>you*3 (每次执行fuck时,you的地方同样被执行了3次) 其他跑出样例基本没问题,具体看代码. #include <cstdio> #include <cstring> #include

HDU 4891 简单模拟

The Great Pan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1035    Accepted Submission(s): 355 Problem Description As a programming contest addict, Waybl is always happy to take part in vario

hdu 4194(模拟)

符合三者之一的则不满足规定,求不满足规定的个数.直接模拟. 1.被同一个人审查多次 2.被和自己同一组织的审查 3.被审查次数不等于k 代码如下: 1 /************************************************** 2 * Author : xiaohao Z 3 * Blog : http://www.cnblogs.com/shu-xiaohao/ 4 * Last modified : 2014-06-28 17:36 5 * Filename :