分析

由于所以我们可以直接考虑较为大胆的算法
直接枚举,将其暴力直接转移
需要注意的就是,每次的转移方向需要判断一下

时,我们只能转移相同方向上的方案
由于空间问题,我们最好使用滚动数组转移
时间复杂度:

代码

//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;
}