http://codeforces.com/problemset/problem/293/B
#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <complex>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#define MOD 1000000007
/*
Problem: Distinct Paths
Source: CROC 2013 Round 2 (Codeforces 293B)
Author: fts2001
*/
using namespace std;
int n,m,k,Log2[1<<20],a[20][20],f[20][20],used[20];
int dfs(int x,int y){
if(y==m+1){
y=1;
x++;
}
if(x==n+1){
return 1;
}
int p=0,w=-1,cc=f[x-1][y]|f[x][y-1];
for(int i=(~cc)&((1<<k)-1);i;i-=(i&(-i))){
int t=Log2[i&(-i)]+1;
if(!a[x][y] || a[x][y]==t){
f[x][y]=cc|(1<<(t-1));
used[t]++;
if(used[t]==1){
if(w==-1)w=dfs(x,y+1);
p+=w;
}
else if(used[t]){
p+=dfs(x,y+1);
}
if(p>=MOD)p-=MOD;
used[t]--;
}
}
return p;
}
int main(){
ios::sync_with_stdio(false);
cin>>n>>m>>k;
if(n+m-1>k){
cout<<0<<endl;
return 0;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
used[a[i][j]]++;
}
}
for(int i=1;i<=k;i++){
Log2[1<<i]=i;
}
cout<<dfs(1,1)<<endl;
return 0;
}