这道题题面有很强的暗示性,两个人交替代表0,1,之差暗示为相对值。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define ll long long
#define gc getchar()
using namespace std;
const int mod=1000000007;
const int N=805;
inline void qr(int &x)
{
    x=0;char c=gc;
    while(c<'0'||c>'9')c=gc;
    while(c>='0'&&c<='9'){x=x*10+(c^48);c=gc;}
}
void qw(int x)
{
    if(x/10)qw(x/10);
    putchar(x%10+48);
}
int k,t;
inline int zw(int x){return (x%t+t)%t;}
inline void add(int &x,int y){x=(x+y)%mod;}
int f[N][N][16][2];
int a[N][N];
int main()
{
    int n,m;qr(n),qr(m),qr(k);t=k+1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            qr(a[i][j]),f[i][j][a[i][j]][0]=1;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int z=0;z<=k;z++)
            {
                add(f[i+1][j][zw(z-a[i+1][j])][1],f[i][j][z][0]);
                add(f[i+1][j][zw(z+a[i+1][j])][0],f[i][j][z][1]);
                add(f[i][j+1][zw(z-a[i][j+1])][1],f[i][j][z][0]);
                add(f[i][j+1][zw(z+a[i][j+1])][0],f[i][j][z][1]);
            }
    int ans=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            add(ans,f[i][j][0][1]);
    qw(ans);puts("");
    return 0;
}