洛谷题单指南-暴力枚举-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;
}