#include<bits/stdc++.h>
#define N 55
#define K 11
using namespace std;
const int MOD=1e9+7;
int jc[K],a[N][N];
int cu[N][N][K];
int cx[K];
int n,m,k,ans,zy;
inline int A(int n,int m){
long long tmp=1;
for(int i=n;i>n-m;i--) tmp*=i;
return int(tmp%MOD);
}
void dfs(int x,int y,int use,int ge){
if(x==n){
ans+=A(zy,ge);
if(ans>=MOD) ans-=MOD;
return;
}
if(y==m){
dfs(x+1,0,use,ge);
return;
}
if(a[x][y]){
if(cu[x][y][a[x][y]]>2) return;
dfs(x,y+1,use,ge);
return;
}
int f=0;
for(int c=1;c<=k;c++){
if(f&&cx[c]==0) continue;
if(!cx[c]) f=1;
int fge=0;
if(cu[x][y][c]) continue;
if(cx[c]==0) fge=1;
cx[c]++;
for(int i=x;i<n;i++)
for(int j=y;j<m;j++)
cu[i][j][c]++;
dfs(x,y+1,c,ge+fge);
for(int i=x;i<n;i++)
for(int j=y;j<m;j++)
cu[i][j][c]--;
cx[c]--;
}
}
int main(){
jc[0]=jc[1]=1;
for(int i=2;i<=10;i++) jc[i]=jc[i-1]*i;
scanf("%d%d%d",&n,&m,&k);
if(n+m-1>k){
puts("0");
exit(0);
}
zy=k+1;
memset(cx,0,sizeof(cx));
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
if(a[i][j]){
for(int x=0;x<=i;x++)
for(int y=0;y<=j;y++)
cu[x][y][a[i][j]]++;
for(int x=i;x<n;x++)
for(int y=j;y<m;y++)
cu[x][y][a[i][j]]++;
}
if(!cx[a[i][j]]){
zy--;
}
cx[a[i][j]]=1;
}
dfs(0,0,0,0);
printf("%d\n",ans);
return 0;
}
codeforces 293B
最新推荐文章于 2020-03-03 19:33:45 发布