分析
由于所以我们可以直接考虑较为大胆的算法
直接枚举,将其暴力直接转移
需要注意的就是,每次的转移方向需要判断一下
当
时,我们只能转移相同方向上的方案
由于空间问题,我们最好使用滚动数组转移
时间复杂度:
代码
//Newcoder 16735 #include <iostream> #include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #define LL long long #define Lowbit(X) (X&(-X)) #define Lson (X<<1) #define Rson (X<<1|1) #define Cl(X,Y) memset((X),(Y),sizeof(X)) #define FOR(i,A,B) for(LL i=A;i<=B;i++) #define BOR(i,A,B) for(LL i=A;i>=B;i--) #define FOR_SIDE(i,A) for(LL i=Head[A];i;i=Next[i]) #define MOD 1000000007 #define INF 0x3f3f3f3f3f3f3f3f using namespace std; const int MAXN=2e2+10; int Row,Line,Cx,Cy,Endx,Endy,Limit,Round; LL Dist[2][MAXN][MAXN][5]; int Dx[5]={0,1,0,-1,0},Dy[5]={0,0,1,0,-1}; LL Ans; inline void File() { freopen(".in","r",stdin); freopen(".out","w",stdout); } inline bool Check(int X,int Y) { return (X<=Row && X>=1 && Y<=Line && Y>=1); } int main() { //File(); scanf("%d %d %d %d %d %d %d %d",&Row,&Line,&Limit,&Cx,&Cy,&Round,&Endx,&Endy); Dist[0][1][1][0]=1ll; FOR(i,1,Limit) { int Jud=(i & 1); int Opt=(Jud ^ 1); Cl(Dist[Jud],0); FOR(j,1,Row) FOR(k,1,Line) FOR(t,0,4) if(Dist[Opt][j][k][t]) { FOR(p,0,4) { int Nx=j+Dx[p],Ny=k+Dy[p]; if(Check(Nx,Ny) && (max(abs(Cx-j),abs(Cy-k))>Round || t==0 || p==0 || t==p)) (Dist[Jud][Nx][Ny][p]+=Dist[Opt][j][k][t])%=MOD; } } } FOR(i,0,4) { (Ans+=Dist[Limit & 1][Endx][Endy][i])%=MOD; } printf("%lld\n",Ans%MOD); //fclose(stdin); fclose(stdout); system("pause"); return 0; }