题目描述
我们浦之星女子学院的篮球场是一个 R 行 C 列的矩阵,其中堆满了各种学校的杂物 (用 #
表示),空地 (用 .
表示) 好像并不多的样子呢……
我们 Aqours 现在已经一共有 K 个队员了,要歌唱舞蹈起来的话,我们得排成一条 1×K 的直线,一个接一个地站在篮球场的空地上呢 (横竖均可)。
我们想知道一共有多少种可行的站位方式呢。
Aqours 的真正的粉丝的你,能帮我们算算吗?
输入格式
第一行三个整数 R,C,K。
接下来的 R 行 C 列,表示浦之星女子学院篮球场。
输出格式
总共的站位方式数量。
解法1暴力枚举
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 101;
char s[N][N];
int n,m,k;
int ans;
int main()
{
cin>>n>>m>>k;
int ans = 0;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
cin>>s[i][j];
}
}
int cnt = 0;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
cnt = 0;
while(s[i][j] == '.' && j <= m)
{
cnt++;
j++;
}
if(cnt >= k) ans += cnt - k + 1 ;
}
}
for(int j = 1 ; j <= m ; j++)
{
for(int i = 1 ; i <= n ; i++)
{
cnt = 0;
while(s[i][j] == '.' && i <= n)
{
cnt++;
i++;
}
if(cnt >= k) ans += cnt - k + 1;
}
}
if(k == 1) cout<<ans/2;
else cout<<ans;
return 0;
}
解法2dfs
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 101;
char s[N][N];
int n,m,k;
int ans;
int dx[] = {1,0};
int dy[] = {0,1};
void dfs(int x , int y , int i , int t)
{
if(t > k)
{
ans++;
return ;
}
if(s[x][y] == '#' || x < 1 || y < 1 || x > n || y > m) return ;
dfs(x+dx[i],y+dy[i],i,t+1);
return;
}
int main()
{
cin>>n>>m>>k;
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
cin>>s[i][j];
}
}
for(int i = 1 ; i <= n ; i++)
{
for(int j = 1 ; j <= m ; j++)
{
if(s[i][j] == '.')
{
for(int l = 0 ; l < 2 ; l++)
{
dfs(i,j,l,1);
}
}
}
}
if(k == 1) cout<<ans/2;
else cout<<ans;
return 0;
}