题目
浦之星女子学院的篮球场是一个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;
}