defdfs(x, y, count, maxi): # 用count来记录已经捡起来的宝物数 # 用maxi来记录已经捡起来的宝物中最高的价值 global ans
ifnot (0 <= x < n and0 <= y < m): return if x == n-1and y == m-1: # 有两种情况可以满足走到出口时小明正好有k件宝贝 # 一种是在这之前已经拿到了k件宝贝 # 另一种是恰好在出口处捡到了第k件宝贝 if count == k or (count == k-1and arr[x][y] > maxi): ans += 1 return
# 开始搜索,一共有四种情况:向下拿,向右拿,向下不拿,向右不拿 for dx, dy in dirs: nx, ny = x + dx, y + dy # 不拿 dfs(nx, ny, count, maxi) # 拿 if arr[x][y] > maxi: dfs(nx, ny, count+1, arr[x][y])
if __name__ == "__main__": n, m, k = map(int, input().split())
arr = [[0for i inrange(m+1)] for j inrange(n+1)] for i inrange(n): ls = list(map(int, input().split())) for j inrange(m): arr[i][j] = ls[j]
dirs = [(0, 1), (1, 0)] # Python中用_来表示不被关心的变量,在这里用其长短变化可以较为直观地显示出层级变化 mem = [[[[-1for _ inrange(15)] for __ inrange(15)] for ___ inrange(55)] for ____ inrange(55)]
defdfs_memory(x, y, count, maxi): ans = 0
# 说明已经被记录过 if mem[x][y][count][maxi] != -1: return mem[x][y][count][maxi]
ifnot (0 <= x < n and0 <= y < m): return0 if x == n-1and y == m-1: if count == k or (count == k-1and arr[x][y] > maxi): ans += 1
# 开始搜索 for dx, dy in dirs: nx, ny = x + dx, y + dy ans += dfs_memory(nx, ny, count, maxi) if arr[x][y] > maxi: ans += dfs_memory(nx, ny, count+1, arr[x][y])
mem[x][y][count][maxi] = ans % 1000000007 return mem[x][y][count][maxi]
if __name__ == "__main__": n, m, k = map(int, input().split())
arr = [[0for i inrange(m+1)] for j inrange(n+1)] for i inrange(n): ls = list(map(int, input().split())) for j inrange(m): arr[i][j] = ls[j]
ans = dfs_memory(0, 0, 0, -1) print(ans % 1000000007)