#include<iostream>
using namespace std;
int a[101][101];
int dp[101][101];
int dir[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};
int n,k;
int Dfs(int i,int j)//深搜方位
{
int p,q,s,t,temp,m = 0;
if(dp[i][j] > 0)
return dp[i][j];
for(p = 0;p < 4;p++)//搜四个方向
for(q = 1;q <= k;q++)//一次可以跳1-k步
{
s = i + dir[p][0]*q;
t = j + dir[p][1]*q;
if(s>=1 && s<=n && t>=1 && t<= n && a[i][j] < a[s][t])
{
temp = Dfs(s,t);
if(m < temp)//从周围找到最大的数
{
m = temp;
}
}
}
dp[i][j] = m + a[i][j];//本身也要加上
return dp[i][j];
}
int main()
{
while(cin>>n>>k)
{
if(n == -1 && k == -1)
break;
int i,j;
for(i = 1;i <= n;i++)
for(j = 1; j <= n;j++)
{
scanf("%d",&a[i][j]);
dp[i][j] = 0;
}
Dfs(1,1);
cout<<dp[1][1]<<endl;
}
return 0;
}