#include <iostream>
#include <cstdlib>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;
int nomal_x_direction[4]= {-1,1,0,0};
int nomal_y_direction[4]= {0,0,-1,1};
int skill_x_direction[8] = {-1,-2,-2,-1,1,2,2,1};
int skill_y_direction[8] = {-2,-1,1,2,-2,-1,1,2};
int K,W,H; // K는 말처럼 이동가능한 횟수, W는 가로길이, H는 세로길이
int Zoo[201][201]; //1은 장애물, 0은 그냥 평지
int visited[31][201][201];
struct Data{
int x;
int y;
int remainedSkill;
Data(int a, int b, int r):x(a),y(b),remainedSkill(r){}
};
int bfs(Data d);
int main(){
freopen("input.txt","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0);
memset(visited, false, sizeof(visited));
memset(Zoo, 0, sizeof(Zoo));
cin>>K>>W>>H;
int temp;
int i;
for(int j=0; j<H; ++j){
for(int k=0; k<W; ++k){
cin>> temp;
Zoo[j][k] = temp;
}
}
cout<<bfs(Data(0,0,K));
//cout<<"\n";
/*for(int i=0; i<H; ++i){
for(int j=0; j<W; ++j){
cout<<visited[K][i][j]<<" ";
}
cout<<"\n";
}*/
return 0;
}
int bfs(Data d){
queue<Data> que;
que.push(d);
visited[d.remainedSkill][d.x][d.y] = true;
int step_size=0;
int total_step_size=0;
Data tmp(-1,-1,-1);
while( !que.empty() ){
step_size = que.size();
for(int s=0; s<step_size; ++s){
tmp = que.front();
que.pop();
if( (tmp.y == W-1) && (tmp.x==H-1) ){
return total_step_size;
}
for(int i=0; i<4; ++i){
//일반 탐색
if(
(nomal_x_direction[i]+tmp.x)>=0 &&
(nomal_x_direction[i]+tmp.x)<H &&
(nomal_y_direction[i]+tmp.y)>=0 &&
(nomal_y_direction[i]+tmp.y)<W &&
visited[tmp.remainedSkill][nomal_x_direction[i]+tmp.x][nomal_y_direction[i]+tmp.y] == false &&
Zoo[nomal_x_direction[i]+tmp.x][nomal_y_direction[i]+tmp.y] == 0
){
que.push(Data(nomal_x_direction[i]+tmp.x, nomal_y_direction[i]+tmp.y, tmp.remainedSkill));
visited[tmp.remainedSkill][nomal_x_direction[i]+tmp.x][nomal_y_direction[i]+tmp.y] = true;
//cout<<i<<"\n";
//cout<<nomal_x_direction[i]<<" <> "<<tmp.x<<"\n";
//cout<<nomal_y_direction[i]<<" <> "<<tmp.y<<"\n";
//cout<<"\n추가: "<<nomal_x_direction[i]+tmp.x<<" "<<nomal_y_direction[i]+tmp.y<<"\n";
}
}
if( tmp.remainedSkill > 0 ){
//말처럼 이동할 수 있을떄
for(int i=0; i<8; ++i){
if(
(skill_x_direction[i]+tmp.x)>=0 &&
(skill_x_direction[i]+tmp.x)<H &&
(skill_y_direction[i]+tmp.y)>=0 &&
(skill_y_direction[i]+tmp.y)<W &&
visited[tmp.remainedSkill-1][skill_x_direction[i]+tmp.x][skill_y_direction[i]+tmp.y] == false &&
Zoo[skill_x_direction[i]+tmp.x][skill_y_direction[i]+tmp.y] == 0
){
que.push(Data(skill_x_direction[i]+tmp.x, skill_y_direction[i]+tmp.y, tmp.remainedSkill-1));
visited[tmp.remainedSkill-1][skill_x_direction[i]+tmp.x][skill_y_direction[i]+tmp.y] = true;
}
}
}
}
total_step_size++;
}
return -1; //도착하지 못한 채로 갈 수 있는 곳 모두 탐색완료
}