原题链接:P3654 First Step (ファーストステップ) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
注意:
- 是在搜索的时候方向不能改变,所以要多一个参数来控制方向。
- 这里必须方向不能是重叠的,不然会重复计算方案数
- 当只有一个人的时候,向右和向下搜是一样的,所以一个方案被算了两次,结果要特判
代码如下:
#include<bits/stdc++.h>
using namespace std; //r行c列
int dirt[2][2] = {{1,0}, {0, 1}};
int r, c, k, ans;
char arr[110][110];
void dfs(int x, int y, int i,int u) //x, y表示当前位置, i表示偏移方向,u表示当前是第几个人
{
if(u > k)
{
ans++;
return;
}
if(arr[x][y] != '.' || x < 1 || y < 1 || x > r || y > c ) return ;
dfs(x + dirt[0][i], y + dirt[1][i],i, u + 1);
}
int main()
{
cin >> r >> c >> k;
for(int i = 1; i <= r; i ++)
for(int j = 1; j <= c; j ++)
cin >> arr[i][j];
for(int i = 1; i <= r; i ++)
for(int j = 1; j <= c; j ++)
if(arr[i][j] == '.')
{
dfs(i, j, 0, 1); //向下搜
dfs(i, j, 1, 1); //向右搜
}
if(k == 1) cout << (ans / 2);
else cout << ans;
return 0;
}