




import sys
input = sys.stdin.readline
ddx = (-1, -1, 1, 1)
ddy = (-1, 1, -1, 1)
dx = (-1, 1, 0, 0)
dy = (0, 0, -1, 1)
N, M, K, C = map(int, input().split())
board = [list(map(int, input().split())) for n in range(N)]
def upgrade_tree():
adj_tree = dict()
for x in range(N):
for y in range(N):
if board[x][y] > 0:
adj_tree[(x, y)] = [0, 0]
for d in range(4):
nx=x+dx[d]; ny=y+dy[d]
if 0<=nx<N and 0<=ny<N:
if board[nx][ny] == 0 and herbicide[nx][ny] == 0:
adj_tree[(x, y)][0] += 1
adj_tree[(x, y)].append(d)
if board[nx][ny] > 0 and herbicide[nx][ny] == 0:
adj_tree[(x, y)][1] += 1
for tree_pos in adj_tree.keys():
x, y = tree_pos
board[x][y] += adj_tree[tree_pos][1]
if adj_tree[tree_pos][0] != 0: n = board[x][y] // adj_tree[tree_pos][0]
else: n = 0
for d in adj_tree[tree_pos][2:]:
nx=x+dx[d]; ny=y+dy[d]
board[nx][ny] += n
def disperse_herbicide():
global total_tree_cnt
kx, ky = -1, -1; tree_cnt_li = []
for x in range(N):
for y in range(N):
if board[x][y] > 0:
tree_cnt = board[x][y]
for i in range(4):
nx=x; ny=y
for k in range(K):
nx+=ddx[i]; ny+=ddy[i]
if 0<=nx<N and 0<=ny<N:
if board[nx][ny] == -1 or board[nx][ny] == 0: break
elif board[nx][ny] > 0: tree_cnt += board[nx][ny]
tree_cnt_li.append((-tree_cnt, x, y))
if tree_cnt_li:
tree_cnt_li.sort(); kx, ky = tree_cnt_li[0][1], tree_cnt_li[0][2]
total_tree_cnt += -tree_cnt_li[0][0]
for x in range(N):
for y in range(N):
if herbicide[x][y] > 0: herbicide[x][y] -= 1
board[kx][ky] = 0; herbicide[kx][ky] = C
for i in range(4):
nx=kx; ny=ky
for k in range(K):
nx+=ddx[i]; ny+=ddy[i]
if 0<=nx<N and 0<=ny<N:
if board[nx][ny] == -1: break
elif board[nx][ny] == 0: herbicide[nx][ny] = C; break
elif board[nx][ny] > 0: board[nx][ny] = 0; herbicide[nx][ny] = C
herbicide = [[0]*N for n in range(N)]
total_tree_cnt = 0
for m in range(M):
upgrade_tree()
disperse_herbicide()
print(total_tree_cnt)