原题:https://www.luogu.com.cn/problem/P1002
这是个很明显的dp题,我们现在分析下状态,用一个二维数组a表示走到了第i,j个位置的方案数。
然后根据这个状态分析,走到这个点只能从(i-1,j)和(i,j-1)走来,这样我们的状态转移方程就得出了:
a[i][j]=a[i-1][j]+a[i][j-1]然后我开开心心去写了个代码,发现全是0……,我估计你们不会犯这个错误(也可能一时激动)我忘了把初始点设为1。
接下来就是些细节,马能到的位置和马能走到的位置a肯定为0,因此我们bool一个Map数组记录不能走的位置,直接不计算。
马能走8个方位(别说你们不知道),这样根据输入提前确定好Map。
接下来是代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<string> #include<cmath> using namespace std; int fx[10] = {0, -2, -1, 1, 2, 2, 1, -1, -2}; int fy[10] = {0, 1, 2, 2, 1, -1, -2, -2, -1};//马能走的8个方向 int n,m,x,y; long long a[101][101];//注意一定要long long 别问,问就是在没AC后找了半天 bool Map[101][101];//记录位置 int main() { cin>>n>>m>>x>>y; n+=10;m+=10;x+=10;y+=10;//我怕数组越界,也可能不会…… a[10][10]=1;//一定别忘 Map[x][y]=1;//马的位置 for(int i=1;i<=8;i++) Map[x+fx[i]][y+fy[i]]=1;//处理Map for(int i=10;i<=n;i++) for(int j=10;j<=m;j++) { if(!Map[i][j]) a[i][j]=max(a[i][j],a[i-1][j]+a[i][j-1]); }//dp cout<<a[n][m]; }