2018湖南省第14届大学生计算机程序设计竞赛 D: 卖萌表情

Posted jkzr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018湖南省第14届大学生计算机程序设计竞赛 D: 卖萌表情相关的知识,希望对你有一定的参考价值。

Description

已知以下 4 种都是卖萌表情(空白的部分可以是任意字符。竖线是便于展示的分隔符,没有实际意义):

^ ^ |  ^  | <  |  >
 v  | v v |  > | <
    |     | <  |  >

给出 n 行 m 列的字符矩阵,Bobo 希望找出互不重叠的卖萌表情数量的最大值。互不重叠的意思是每个字符只属于至多一个卖萌表情。

  • 1?≤?n,?m?≤?1000
  • 矩阵只包含 ^v<> 4 种字符。
  • n?×?m 的和不超过 2?×?106.

Input

输入文件包含多组数据,请处理到文件结束。

每组数据的第一行包含 2 个整数 n 和 m.

接下来 n 行的第 i 行包含长度为 m 的字符串,表示字符矩阵的第 i 行。

Output

对于每组数据输出 1 个整数表示互不重叠的卖萌表情数量的最大值。

Sample Input

2 4
^^^^
>vv<
2 4
vvvv
>^^<
4 2
v>
<>
<>
^>
3 4
^>^>
<v>v
>>>>

Sample Output

2
0
2
2

思路:贪心,由图我们可以看出这个表情分为两种类型,那么对于前两种哪个表情优先级更高一些呢,你可以看图,虽然这个图有点迷,但是仔细看一下应该还是能懂的(尴尬脸),

技术分享图片

对于第二类的表情其实没啥区别,优先级一样。那么知道这些就很简单了。直接看代码吧。
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <set>
#include <stack>
#include <vector>
#include <deque>
#include <list>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const double eps=1e-8;
const double pi=acos(-1.0);
const int MOD=1e9+7;
const int maxn=1005;
int n,m,cnt;
char s[maxn][maxn];
bool vis[maxn][maxn];
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        memset(vis,false,sizeof(vis));
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]+1);
//        for(int i=1;i<=n;i++)
//            printf("%s
",s[i]+1);
        cnt=0;
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(s[i][j]==v)
                {
                    if(j-2>0)
                    {
                        if((s[i][j-2]==v&&vis[i][j-2]==false&&s[i-1][j-1]==^&&vis[i-1][j-1]==false))
                        {
                            cnt++;
                            vis[i][j]=true;vis[i][j-2]=true;vis[i-1][j-1]=true;
                        }
                    }
                    if(s[i-1][j-1]==^&&s[i-1][j+1]==^&&vis[i-1][j-1]==false&&vis[i-1][j+1]==false)
                    {
                        cnt++;
                        vis[i][j]=true;vis[i-1][j-1]=true;vis[i-1][j+1]=true;
                    }
                }
            }
        }
//        printf("%d
",cnt);
        if(n<3)
            printf("%d
",cnt);
        else
        {
            for(int i=3;i<=n;i++)
            {
                for(int j=1;j<=m;j++)
                {
                    if(s[i][j]==<)
                    {
                        if(s[i-1][j+1]==>&&vis[i-1][j+1]==false&&s[i-2][j]==<&&vis[i-2][j]==false)
                        {
                            cnt++;
                            vis[i][j]=true;vis[i-1][j+1]=true;vis[i-2][j]=true;
                        }
                    }
                    if(s[i][j]==>)
                    {
                        if(s[i-1][j-1]==<&&vis[i-1][j-1]==false&&s[i-2][j]==>&&vis[i-2][j]==false)
                        {
                            cnt++;
                            vis[i][j]=true;vis[i-1][j-1]=true;vis[i-2][j]=true;
                        }
                    }
                }
            }
            printf("%d
",cnt);
        }
    }
    return 0;
}
/**********************************************************************
    Problem: 1361
    User: HNCPCteam001
    Language: C++
    Result: AC
    Time:528 ms
    Memory:3996 kb
**********************************************************************/

 



以上是关于2018湖南省第14届大学生计算机程序设计竞赛 D: 卖萌表情的主要内容,如果未能解决你的问题,请参考以下文章

2018湖南省第14届大学生计算机程序设计竞赛 C: 时间旅行

2018年湖南省第十四届大学生计算机程序设计竞赛

最短路STLCSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)

湖南省第九届大学生计算机程序设计竞赛 Interesting Calculator

湖南省第十二届大学生计算机程序设计竞赛 G Parenthesis

湖南省第十二届大学生计算机程序设计竞赛 A 2016