雕刻时光

just do it……nothing impossible
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

dfs+dp——[Usaco2008 Mar]Cow Travelling游荡的奶牛

Posted on 2011-03-23 20:48  huhuuu  阅读(401)  评论(0编辑  收藏  举报
dp[i][j][k]记录在i,j格子里,剩下k步可以到达终点的路径条数
View Code
#include<stdio.h>
#include
<iostream>
#include
<math.h>
using namespace std;

bool map[109][109];
int fa,fb,ea,eb,add;
int f[4][2]={0,-1,-1,0,0,1,1,0};
int dp[109][109][19];
int n,m,all;

int dfs(int a,int b,int step)
{
if(dp[a][b][step]!=-1)return dp[a][b][step];
if((abs(a-ea)+abs(b-eb))>step)//曼哈顿路径剪枝
return dp[a][b][step]=0;

if(step==0)
{
if(a==ea&&b==eb)
return dp[a][b][0]=1;
else
return dp[a][b][0]=0;
}

int i;
dp[a][b][step]
=0;
for(i=0;i<=3;i++)
{
int sa,sb,sstep;
sa
=a+f[i][0];
sb
=b+f[i][1];
sstep
=step-1;

if(sa>=1&&sa<=n&&sb>=1&&sb<=m&&map[sa][sb]==0)
{
dp[a][b][step]
+=dfs(sa,sb,sstep);
}
}
return dp[a][b][step];
}

int main()
{
while(scanf("%d%d%d",&n,&m,&all)!=EOF)
{
int i,j,k;
char t;
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=m;j++)
{
scanf(
"%c",&t);
if(t=='*')
map[i][j]
=1;
else
map[i][j]
=0;
for(k=0;k<=all;k++)
dp[i][j][k]
=-1;
}
}

scanf(
"%d%d",&fa,&fb);
scanf(
"%d%d",&ea,&eb);
add
=0;
int te;

te
=dfs(fa,fb,all);

printf(
"%d\n",te);
}
return 0;
}