Codeforces Round #460 (Div. 2) C. Seat Arrangements

蛮早之前的cf的题,突然翻到了发现自己比赛过程中没做出来下来也并没有把它补出来,感觉div2我不应该做不出来啊哈哈哈蜜汁自信,就把这题补了。

题意:给一个n*m的矩阵里面含有'*'和'.'两种字符,要你找横行和竖行中长度不小于k的连续' . '有多少种。

记得当时我是以为要写dfs,也不知道为什么我这种dfs根本没入门的人有勇气现场写dfs,现在看一看完全就是暴力模拟就能做的题,因为题目要求必须是同一行或者同一列之中的连续' . ',所以只用分别枚举每一行和每一列有多少个满足要求的连续序列最后把答案加起来就好了。这里需要注意的是,有一个特判点:当k为1的时候,横行和竖行就是同一种情况了,所以应该把答案除以二因为你重复统计了。

附上AC代码:

#include<bits/stdc++.h>
using namespace std;
char a[2010][2010];
int r[2010],c[2010];
int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    getchar();
    memset(r,0,sizeof(r));
    memset(c,0,sizeof(c));
    for(int i=0; i<n; i++)
        scanf("%s",a[i]);
    for(int i=0; i<n; i++)
    {
        int cnt=0;
        for(int j=0; j<m; j++)
        {
            if(a[i][j]!='.')
                cnt=0;
            else if(a[i][j]=='.')
            {
                if(a[i][j-1]=='.')
                cnt++;
                else cnt=1;
            }
            if(cnt>=k)
                r[i]++;
        }
       // printf("%d  ",r[i]);
    }
    //printf("\n");
     for(int j=0; j<m; j++)
    {
        int cnt=0;
        for(int i=0; i<n; i++)
        {
            if(a[i][j]!='.')
                cnt=0;
            else if(a[i][j]=='.')
            {
                if(a[i-1][j]=='.')
                cnt++;
                else cnt=1;
            }
            if(cnt>=k)
                c[j]++;
        }
        //printf("%d  ",c[j]);
    }
    int ans=0;
    for(int i=0;i<n;i++)
        ans+=r[i];
        for(int i=0;i<m;i++)
            ans+=c[i];
            if(k==1)
                ans/=2;
        printf("%d\n",ans);
    return 0;

}

这里给自己留一句话,不努力你永远只能做别人眼里的傻子。

猜你喜欢

转载自blog.csdn.net/wookaikaiko/article/details/80951469