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\n",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\n",cnt);
        if(n<3)
            printf("%d\n",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\n",cnt);
        }
    }
    return 0;
}
/**********************************************************************
    Problem: 1361
    User: HNCPCteam001
    Language: C++
    Result: AC
    Time:528 ms
    Memory:3996 kb
**********************************************************************/

 

posted @ 2018-09-06 23:34  从让帝到the_rang  阅读(543)  评论(0编辑  收藏  举报