【搜索】P3654 First Step (ファーストステップ)
难度:普及-
算法:dfs
思路:
坑点:当 k == 1 时,需要除以2,因为向右向下搜索了两遍。
横着竖着都可以,因此搜索的时候按两种方向进行搜索;
如何不重复的搜索呢?
把每一个合法的点(空地)都搜索一遍,从右方向搜索一遍,再从左方向搜索一遍。
因为我们要连续的一块地因此搜索的时候只能一个方向搜到底。
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 110;
int n,m,k;
char mp[N][N];
int dx[2] = {0,1}, dy[2] = {1,0}; //偏移量向下、向右
int ans;
//x表示横坐标,y表示纵坐标
//u表示方向的坐标
//v表示 次数
void dfs(int x,int y,int i,int u){
if(u > k) {
ans ++;
return;
}
//判断不可行的情况
if(mp[x][y] == '#' || x < 0 || y < 0 || x >= n ||y >= m) return;
dfs(x + dx[i],y + dy[i],i,u + 1);
return;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m >> k;
for(int i = 0; i < n; i++){
cin >> mp[i];
}
for(int i = 0; i < n ; i++){
for(int j = 0; j < m; j++){
if(mp[i][j] == '.'){
//为什么循环两次?因为可以向下向右两个方向进行搜索
for(int p = 0; p < 2; p ++){
dfs(i,j,p,1); //为什么是 1 ,因为当前我脚下的是一片空地
}
}
}
}
if(k == 1){
ans /= 2; //如果 k = 1是需要除以2,因为我们向右,向下搜索了两遍
}
cout << ans << endl;
return 0;
}