题:https://ac.nowcoder.com/acm/problem/16735
分析:枚举时间。dp[i][j][k][z],代表从(1,1)到(j,k)由方式z走到的方案数,第一维记录上一次的状态
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int M=202; const int mod=1e9+7; ll dp[2][M][M][6]; int px[]={0,0,0,1,-1}; int py[]={0,1,-1,0,0}; int main(){ int n,m,t,x1,y1,D,x2,y2; scanf("%d %d %d %d %d %d %d %d",&n,&m,&t,&x1,&y1,&D,&x2,&y2); dp[0][1][1][0]=1;///不动为1种方案 int cur,las; for(int i=1;i<=t;i++){ cur=i&1, las=1-cur; for(int j=0;j<=n;j++) for(int k=0;k<=m;k++) for(int z=0;z<5;z++) dp[cur][j][k][z]=0; for(int j=1;j<=n;j++){ for(int k=1;k<=m;k++) for(int z=0;z<5;z++) if(dp[las][j][k][z]){ for(int p=0;p<5;p++){ int tx=j+px[p]; int ty=k+py[p]; if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&(max(abs(j-x1),abs(k-y1))>D || z==0 || p==0 || z==p )) dp[cur][tx][ty][p]=(dp[cur][tx][ty][p]+dp[las][j][k][z])%mod; } } } } ll ans=0; for(int z=0;z<5;z++) ans=(ans+dp[cur][x2][y2][z])%mod; printf("%lld ",ans); return 0; }