今日学习记录
1. P1535 USACO08MAR Cow Travelling S - 洛谷
关键词:dfs 记忆化
问题分析
就是求从一个点在给定时间内到另一个点的所以方案数,包含障碍物
核心思路
就是简单的搜索,涉及记忆化,这里的记忆化要额外记忆时间,在某个点的不同时间会有不同的方案数
**最终代码:
#include <bits/stdc++.h>
using namespace std;
#define fo(i,l,r) for(int i=(l);i<=(r);++i)
#define ve vector
#define endl '\n'
using ll = long long;
using ull = unsigned long long;
using sr = string;
using db = double;
using dll = double long;
const int MOD=998244353;
const ll INF=1e18;
const int DIR[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};
const int N = 105;
int r1,c1,r2,c2,n,m,T;
ve arr(N,ve<char>(N));
ve memet(N,ve(N,ve<int>(20,-1)));
int dfs(int r,int c,int t){
int &res = memet[r][c][t];
if(res!=-1) return res;
if(abs(r2-r)+abs(c2-c)>T-t) return res = 0;
if(t==T){
if(r==r2&&c==c2) return res = 1;
return res = 0;
}
int ans = 0;
for(auto &d:DIR){
int x = r + d[0],y = c + d[1];
if(x>0&&x<=n&&y>0&&y<=m&&arr[x][y]!='*') ans += dfs(x,y,t+1);
}
return res = ans;
}
void solve(){
cin>>n>>m>>T;
fo(i,1,n){
fo(j,1,m){
cin>>arr[i][j];
}
}
cin>>r1>>c1>>r2>>c2;
cout<<dfs(r1,c1,0);
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
solve();
}学到的点:
- 过于简单