6.1 马拦过河卒
题目链接
题目思路
动态规划,把原问题分解成子问题,找动态方程
代码实现
#include<bits/stdc++.h> #define int long long using namespace std; int dr[8][2]={{2,1},{2,-1},{-1,2},{1,-2},{-2,-1},{-1,-2},{1,2},{-2,1}}; const int Max=30; int n,m,x,y; int dp[Max][Max],mp[Max][Max]; signed main() { cin>>n>>m>>x>>y; for(int i=0;i<8;i++) { mp[x+dr[i][0]][y+dr[i][1]]=1; } mp[x][y]=1; dp[0][0]=1; for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) { if(!mp[i+1][j]) dp[i+1][j]+=dp[i][j]; if(!mp[i][j+1]) dp[i][j+1]+=dp[i][j]; } cout<<dp[n][m]<<endl; return 0; }