#include <bits/stdc++.h>
using namespace std;

const int Mod = 1e9+7;
int n,m,k;
vector<vector<int>>grid;
using ll =  long long;


void spreadZer(){
	queue<pair<int,int>>q;
	vector<vector<int>>dist(n+1,vector<int>(m+1,INT_MAX));
	
	for(int i = 1;i<=n;i++){
		for(int j= 1;j<=m ;j++){
			if(grid[i][j]==0){
				q.emplace(i,j);
				dist[i][j]=0;
			}
		}
	}
	
	vector<vector<int>>dirn = {{-1,0},{1,0},{0,-1},{0,1}};
	
	while(!q.empty()){
		auto u= q.front();
		int x =  u.first;
		int y = u.second;
		q.pop();
		
		for(auto v:dirn){
			int dx = v[0];
			int dy = v[1];
			int nx = x+dx;int ny = y+dy;
			if(nx>=1 && ny>=1 && nx<=n && ny<=m && dist[nx][ny] == INT_MAX){
				
				dist[nx][ny]=dist[x][y]+1;
				if(dist[nx][ny]<=k)
				{
				grid[nx][ny]=0;
				q.emplace(nx,ny);
				}
			}
		}
	}
}
int countPaths(){
	vector<vector<ll>>dp(n+1,vector<ll>(m+1,0));
	if(grid[1][1] == 1)dp[1][1]=1;
	
	for(int i = 1 ;i<=n ;i++){
		for(int j = 1 ; j<=m ;j++){
			if(i==1 && j==1 || grid[i][j] == 0)continue;
			dp[i][j] = dp[i-1][j]+dp[i][j-1];
		}
	}
	return dp[n][m];
}
int main() {
	//int n,m;
	cin>>n>>m>>k;
	grid.assign(n+1,vector<int>(m+1)); 
	//int pack[n][m]; 
	for(int i = 1 ; i <= n ;i++){
		for(int j = 1 ; j <= m ;j++){
			cin>>grid[i][j];
		}
	} 

	spreadZer();
	cout<<countPaths()<<endl;
	return 0;
}