题目链接:https://ac.nowcoder.com/acm/contest/301/F
思路:记忆化搜索(DFS)dp[ x ][ y ][ s ] 代表第 s 步 走到 x y 的方案数。搜索的时候记录状态,避免不必要的重复搜索。
#include <bits/stdc++.h>
#define maxn 205
#define ll long long
const int mod = 1000000007;
using namespace std;
ll dp[maxn][maxn][maxn];
int dir[8][2] = {1,2, 1,-2, -1,2, -1,-2, 2,1, 2,-1, -2,-1, -2,1};
int n,m,k;
bool Check(int x,int y)
{
if(x >= 0 && x < n && y >= 0 && y < m)return true;
return false;
}
int dfs(int x,int y,int step)
{
if(dp[x][y][step] != -1) return dp[x][y][step];
if(step == k)
{
if(x == n - 1 && y == m - 1) return 1;
else return 0;
}
ll sum = 0;
for(int i = 0; i < 8; i++)
{
int tx = x + dir[i][0];
int ty = y + dir[i][1];
if(Check(tx, ty))
{
sum += dfs(tx, ty, step + 1);
sum %= mod;
}
}
dp[x][y][step] = sum;
return sum;
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(dp,-1,sizeof(dp));
ll ans = dfs(0,0,0);
printf("%lld\n",ans);
}
return 0;
}