洛谷 P3654 First Step (ファーストステップ)
https://www.luogu.org/problemnew/show/P3654
题目描述
可是……这个篮球场,好像很久没有使用过的样子啊……
里面堆满了学校的各种杂物呢……
我们Aqours的成员要怎么在里面列队站下呢?
我们浦之星女子学院的篮球场是一个R行C列的矩阵,其中堆满了各种学校的杂物 (用"#"表示),空地 (用"."表示) 好像并不多的样子呢……
我们Aqours现在已经一共有K个队员了,要歌唱舞蹈起来的话,我们得排成一条1*K的直线,一个接一个地站在篮球场的空地上呢 (横竖均可)。
我们想知道一共有多少种可行的站位方式呢。
Aqours的真正的粉丝的你,能帮我们算算吗?
输入输出格式
输入格式:
第一行三个整数 R, C, K。
接下来的R行C列,是浦之星女子学院篮球场。
输出格式:
总共的站位方式数量。
输入输出样例
说明
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) 无
思路:模拟(maybe搜索也可以,but我的dfs也WA了也TLE了 qwq)
难度:普及-
以下是题目自带标程(我自己的就不现出来丢人了。。):
//我稍微压了一下行。。。 #include <iostream> using namespace std; char a[105][105]; int ans = 0; int main() { int r, c, k; cin >> r >> c >> k; for(int i = 1; i <= r; i++) for(int j = 1; j <= c; j++) cin >> a[i][j]; for(int i = 1; i <= r; i++) { int cnt = 0; for(int j = 1; j <= c+1; j++) { if(a[i][j] == '.') cnt++; else { if(cnt-k+1 > 0) ans += cnt - k + 1; cnt = 0; } } } for(int i = 1; i <= c; i++) { int cnt = 0; for(int j = 1; j <= r+1; j++) { if(a[j][i] == '.') cnt++; else { if(cnt-k+1 > 0) ans += cnt - k + 1; cnt = 0; } } } if(k == 1) cout << ans / 2 << endl; else cout << ans << endl; }