1 /*记忆化dfs+dp,因为每次最多走k步,所以上下左右的方向有所扩展,
2 dp[i][j]存的是从dp[i][j]出发能吃的最大个数*/
3 #include<stdio.h>
4 #include<string.h>
5 #include<algorithm>
6 using namespace std;
7 const int maxn=110;
8 int map[maxn][maxn],vis[maxn][maxn];
9 int dp[maxn][maxn];//dp[i][j]表示从i,j出的最大蛋糕数目
10 int n,m,k;
11 void init()
12 {
13 memset(dp,0,sizeof(dp));
14 memset(vis,0,sizeof(vis));
15 }
16 int dfs(int x,int y)
17 {
18 if(dp[x][y]) return dp[x][y];
19 int i,j;
20 dp[x][y]=map[x][y];
21 for(i=1;i<=k;i++)
22 {
23 if(x-i>=1 && map[x-i][y]>map[x][y])
24 {
25 dp[x][y]=max(dp[x][y],dfs(x-i,y)+map[x][y]);
26 }
27 if(x+i<=n && map[x+i][y]>map[x][y])
28 {
29 dp[x][y]=max(dp[x][y],dfs(x+i,y)+map[x][y]);
30 }
31 if(y-i>=1 && map[x][y-i]>map[x][y])
32 {
33 dp[x][y]=max(dp[x][y],dfs(x,y-i)+map[x][y]);
34 }
35 if(y+i<=n && map[x][y+i]>map[x][y])
36 {
37 dp[x][y]=max(dp[x][y],dfs(x,y+i)+map[x][y]);
38 }
39 }
40 return dp[x][y];
41 }
42 int main()
43 {
44 int i,j;
45 while(scanf("%d%d",&n,&k)!=EOF)
46 {
47 if(n==-1 && k==-1) break;
48 for(i=1;i<=n;i++)
49 for(j=1;j<=n;j++)
50 scanf("%d",&map[i][j]);
51 init();
52 printf("%d\n",dfs(1,1));
53 }
54 return 0;
55 }