洛谷题单指南-暴力枚举-P3654 First Step (ファーストステップ)

原题链接:https://www.luogu.com.cn/problem/P3654

题意解读:在r * c矩阵中,找连续k个.的总数。

解题思路:

本题直接枚举即可,

在每一行中,以每一列为起点,连续判断k个元素,如果全为'.',则方案数加1

在每一列中,以每一行为起点,连续判断k个元素,如果全为'.',则方案数加1

注意:

如果k=1,只有一个人,在行、列中判断时,'.'会被重复计数,结果需要除以2,否则只能得到80分。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 105;

char a[N][N];
long long cnt;
int r, c, k;

int main()
{
    cin >> r >> c >> k;
    for(int i = 1; i <= r; i++)
        for(int j = 1; j <= c; j++)
            cin >> a[i][j];
    
    //在每行找有多少连续k个"."
    for(int x = 1; x <= r; x++) //遍历每行
    {
        for(int i = 1; i <= c - k + 1; i++) //对每一行考虑每一列作为开头
        {
            bool findk = true;
            for(int j = i; j <= i + k - 1; j++) //判断连续k个是否为.
            {
                if(a[x][j] != '.')
                {
                    findk = false;
                    break;
                }
            }
            if(findk) cnt++;
        }
    }

    //在每列找有多少连续k个"."
    for(int y = 1; y <= c; y++) //遍历每列
    {
        for(int i = 1; i <= r - k + 1; i++) //对每一列考虑每一行作为开头
        {
            bool findk = true;
            for(int j = i; j <= i + k - 1; j++) //判断连续k个是否为.
            {
                if(a[j][y] != '.')
                {
                    findk = false;
                    break;
                }
            }
            if(findk) cnt++;
        }
    }

    if(k == 1) cnt /= 2; //如果只有1个队员,每个.在行、列都计算了一次,重复

    cout << cnt;

    return 0;

}

 

posted @ 2024-02-01 10:48  五月江城  阅读(29)  评论(0编辑  收藏  举报