题目
浦之星女子学院的篮球场是一个R行C列的矩阵,其中堆满了各种学校的杂物 (用#
表示),空地 (用.
表示) Aqours 现在已经一共有K个队员了,要歌唱舞蹈起来的话,得排成一条1×K的直线,一个接一个地站在篮球场的空地上呢 (横竖均可)。我们想知道一共有多少种可行的站位方式呢。
输入输出格式
输入格式
第一行三个整数R,C,K。
接下来的R行C列,表示浦之星女子学院篮球场。
输出格式
总共的站位方式数量。
输入输出样例
输入样例
5 5 2
.###.
##.#.
..#..
#..#.
#.###
输出格式
8
代码1
从每一个点开始,横向和竖向搜索k位,如果其中没有任何障碍的话就让答案加一。
#include<iostream>
using namespace std;
long long r,c,k,ans;
char a[105][105];
int main(){
cin>>r>>c>>k;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>a[i][j];
}
}
bool f=true;
for(int i=1;i<=r;i++){//横向搜索
for(int j=1;j<=c;j++){
f=true;
for(int s=0;s<k;s++){
if(a[i+s][j]!='.'){
f=false;
break;
}
}
if(f==true){
ans++;
}
}
}
for(int i=1;i<=r;i++){//纵向搜索
for(int j=1;j<=c;j++){
f=true;
for(int s=0;s<k;s++){
if(a[i][j+s]!='.'){
f=false;
break;
}
}
if(f==true){
ans++;
}
}
}
if(k==1){
cout<<ans/2;//当k==1时横向纵向都一样,结果除以2
}
else{
cout<<ans;
}
return 0;
}
代码2
先输入一个二维数组,每一个点都dfs扫一遍(分别向下和向右找)如果dfs次数等于k那么就记录+1
#include<iostream>
using namespace std;
int r,c,k,ans;
char a[105][105];
void right(int i,int j,int s){//向右搜索
if(s==k){
ans++;
return;
}
if(a[i][j+1]=='.'){
right(i,j+1,s+1);
}
}
void under(int i,int j,int s){//向下搜索
if(s==k){
ans++;
return;
}
if(a[i+1][j]=='.'){
under(i+1,j,s+1);
}
}
int main(){
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++){
for(int j=1;j<=c;j++){
if(a[i][j]=='.'){
right(i,j,1);
under(i,j,1);
}
}
}
if(k==1){
cout<<ans/2;
}
else{
cout<<ans;
}
return 0;
}