刷表法。
对于某一个点((i,j)),直接求出((i,j))所能到达的所有点,将能到达的点的方案数量加上((i,j))的方案数量。
状态表示:
(f(i,j)):达到点((i,j))的方案数。
状态转移:
[f(i+x,j+y)+=f(i,j)
\
其中,x+y le w[i][j]
]
const int N=110;
int g[N][N];
int f[N][N];
int n,m;
bool check(int x,int y)
{
return x>=1 && x<=n && y>=1 && y<=m;
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(f,0,sizeof f);
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
f[1][1]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
for(int k=0;k<=g[i][j];k++) // 枚举这个点能到的所有点
for(int l=0;l+k<=g[i][j];l++)
{
if(k == 0 && l == 0) continue; // 起始点除外
int a=i+k,b=j+l;
if(check(a,b))
f[a][b]=(f[a][b]+f[i][j])%mod;
}
cout<<f[n][m]<<endl;
}
//system("pause");
return 0;
}