#include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<math.h> using namespace std;
typedef long long ll; const int maxn = 1020000; const ll INF = 0x3f3f3f3f3f3f3f3f; int n,k; int mat[120][120]; int dp[120][120];
struct Node{ int v,r,c; bool operator < (const Node a) { return v>a.v; } }arr[12000];
bool check(int i ,int j) { if (i<1||i>n||j<1||j>n) return false; else return true; }
int main() { int t = 1 ; while (~scanf("%d%d",&n,&k)) { if (n==-1&&k==-1) break; for (int i = 1; i <= n ; i ++) { for (int j = 1 ; j <= n ; j ++) { scanf("%d",&mat[i][j]); dp[i][j] = mat[i][j]; arr[(i-1)*n+j].r = i; arr[(i-1)*n+j].c = j; arr[(i-1)*n+j].v = mat[i][j];
} } sort(arr+1,arr+n*n+1); int x,y; for (int i = 1 ; i <= n*n ; i ++) { x = arr[i].r , y = arr[i].c; for (int p = -k ; p <= k ; p ++) { if (check(x+p,y)&&mat[x+p][y]>mat[x][y]) dp[x][y] = max(dp[x][y],dp[x+p][y]+mat[x][y]); if (check(x,y+p)&&mat[x][y+p]>mat[x][y]) dp[x][y] = max(dp[x][y],dp[x][y+p]+mat[x][y]); } } printf("%d\n",dp[1][1]);