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;
}