#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<=&& 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;
}