思路:
1.标记马点 z[i][[j]=0
2.正常 z[i][j]=z[i-1][j]+z[i][j-1]
#include<iostream> using namespace std; int n,m,a,b; long long ma[30][30],bck[30][30]; int dx[8]={-2,-1,1,2,2,1,-1,-2},dy[8]={1,2,2,1,-1,-2,-2,-1}; void can_not_reach(int x,int y) { ma[x][y]=1; for(int i=0;i<8;i++) { if(x+dx[i]>=0&&x+dx[i]<=n&&y+dy[i]>=0&&y+dy[i]<=m) { ma[x+dx[i]][y+dy[i]]=1; } } } int main() { cin>>n>>m>>a>>b; can_not_reach(a,b); bck[1][0]=1; for(int i=1;i<=n+1;i++) { for(int j=1;j<=m+1;j++) { bck[i][j]=bck[i-1][j]+bck[i][j-1]; if(ma[i-1][j-1])bck[i][j]=0; } } cout<<bck[n+1][m+1]; }
标签:NOIP2002,bck,int,30,P1002,long,&&,dp From: https://www.cnblogs.com/ataraxyyeah/p/17548220.html