代码设计思路
基础思路:以每一个点为起点,分别向右,向下搜索连续长度为k 的片段。
递归边界:step > k,即已经有了长度为k 的片段,直接输出答案
注意*:1. 书写dfs时不能写成
if(a[i][j]){
dfs(step,x + 1, y );
dfs(step,x , y + 1);
}
因为,如果每次搜索只能有一个方向,而不存在先向右后向下的情况。
2. 如果k == 1,即只有一个人的时候,所求出的答案 要除以2,因为向右和向下都满足情况,会重复计算
#include <iostream>
#include <cstdio>
#include <numeric>
#include <functional>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <climits>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <stack>
#include <queue>
#include <bitset>
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 1e6 + 3;
const int N = 1e5 + 5;
int r,c,k;
int a[105][105];
int ans;
int dy[2] = { 0,1 };
int dx[2] = { 1,0 };
void dfs(int step,int x,int y,int i) {
if (step > k) {
ans++;
return;
}
if (x > r || y > c|| a[x][y] == 0) return;
dfs(step + 1, x + dx[i], y + dy[i], i);
return;
}
int main() {
cin >> r >> c >> k;
for (int i = 1; i <= r; ++i) {
for (int j = 1; j <= c; ++j) {
char c;
cin >> c;
if (c == '.') a[i][j] = 1;
else a[i][j] = 0;
//cout << a[i][j] << ' ';
}
//cout << endl;
}
for (int i = 1; i <= r; ++i) {
for (int j = 1; j <= c; ++j) {
if (a[i][j])
{
for(int k = 0; k <= 1; k++)
dfs(1, i, j,k);
}
}
}
if (k == 1)
ans /= 2;
cout << ans;
return 0;
}