传送门: [USACO08MAR]Cow Travelling S - 洛谷
思路: 在二维图上进行dfs搜索会有很多已经提前搜索过的点在图上,将这些已经走过一次的点的状态提前记录下来,就可以不用再搜下去了。
数组d[x][y][t]意义为, 从x,y 出发且x,y之前已经经历了t步的状态走到终点所需的步数。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> PII;
const double PI=3.1415926535;
const int N=1e6+10;
int n,m,t;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
char s[110][110];
int d[110][110][20];
int r1,c1,r2,c2;
int dfs(int x,int y,int t1)
{
if(d[x][y][t1]!=-1) //假如搜索过了
return d[x][y][t1];
if(abs(x-r2)+abs(y-c2)>t-t1) //如果剩余的步数不支持走到终点
{
d[x][y][t1]=0;
return 0;
}
if(t==t1)
{
if(x==r2&&y==c2)
{
d[x][y][t1]=1;
return 1;
}
d[x][y][t1]=0;
return 0;
}
int ans=0;
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<=0||xx>n||yy<=0||yy>m||s[xx][yy]=='*')
continue;
ans+=dfs(xx,yy,t1+1);
}
d[x][y][t1]=ans;
return ans;
}
signed main()
{
scanf("%lld%lld%lld",&n,&m,&t);
memset(d,-1,sizeof d);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
cin>>r1>>c1>>r2>>c2;
cout<<dfs(r1,c1,0)<<endl;
return 0;
}