https://www.luogu.org/contest/show?tid=1614
TB P3654 First Step (ファーストステップ)
https://www.luogu.org/problem/show?pid=3654
题目描述
可是……这个篮球场,好像很久没有使用过的样子啊……
里面堆满了学校的各种杂物呢……
我们Aqours的成员要怎么在里面列队站下呢?
我们浦之星女子学院的篮球场是一个R行C列的矩阵,其中堆满了各种学校的杂物 (用"#"表示),空地 (用"."表示) 好像并不多的样子呢……
我们Aqours现在已经一共有K个队员了,要歌唱舞蹈起来的话,我们得排成一条1*K的直线,一个接一个地站在篮球场的空地上呢 (横竖均可)。
我们想知道一共有多少种可行的站位方式呢。
Aqours的真正的粉丝的你,能帮我们算算吗?
输入输出格式
输入格式:
第一行三个整数 R, C, K。
接下来的R行C列,是浦之星女子学院篮球场。
输出格式:
总共的站位方式数量。
输入输出样例
输入样例#1:
5 5 2 .###. ##.#. ..#.. #..#. #.###
输出样例#1:
8
说明
R C K 备注
1-2 <=10 <=10 <=min(R,C) 无
3-4 <=100 <=100 1 无
5-6 <=100 <=100 <=min(R,C) 没有障碍
7-10 <=100 <=100 <=min(R,C) 无
横着、竖着各遍历一遍数据,每个连续空地长度为l,则答案加上l-k+1
注意:当k=1时,两次遍历结果一样,所以要将答案除2,或开始特判k=1
因为忽略了k=1所以第一次提交80
#include<cstdio> #include<iostream> using namespace std; int r,c,k; int a[102][102]; int main() { scanf("%d%d%d",&r,&c,&k); char ch; for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { cin>>ch; if(ch=='.') a[i][j]=1; } int ans=0,now=0; if(k==1) { for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) { if(a[i][j]) ans++; } printf("%d",ans); return 0; } for(int i=1;i<=r;i++) { now=0; for(int j=1;j<=c+1;j++) { if(a[i][j]==1) now++; else { ans+=now-k+1>0 ? now-k+1:0; now=0; } } //if(a[i][c]) ans+=now-k+1>0 ? now-k+1:0; } for(int j=1;j<=c;j++) { now=0; for(int i=1;i<=r+1;i++) { if(a[i][j]==1) now++; else { ans+=now-k+1>0 ? now-k+1:0; now=0; } } //if(a[r][j]) ans+=now-k+1>0 ? now-k+1:0; } printf("%d",ans); }