#include <iostream> #include <string> #include <vector> #include <queue> #include <algorithm> #include <cstring> using namespace std; int N, M, K; string map[1000]; vector<pair<int, int>> v; int dis[1001][1001][11]; const int dy[4] = { 1,-1,0,0 }; const int dx[4] = { 0,0,1,-1 }; int BFS() { queue<pair<pair<int, int>,int>> q; q.push({ { 0,0 },K }); dis[0][0][K] = 1; while (!q.empty()) { int y = q.front().first.first; int x = q.front().first.second; int cnt = q.front().second; q.pop(); for (int i = 0; i < 4; ++i) { int ny = y + dy[i]; int nx = x + dx[i]; if (!(ny >= 0 && ny < N && nx >= 0 && nx < M)) continue; if (dis[ny][nx][cnt] == 0 && map[ny][nx] == '0') { dis[ny][nx][cnt] = dis[y][x][cnt] + 1; q.push({ { ny,nx }, cnt }); } if (cnt > 0 && map[ny][nx] == '1' && dis[ny][nx][cnt - 1] == 0) { dis[ny][nx][cnt - 1] = dis[y][x][cnt] + 1; q.push({ {ny,nx}, cnt - 1 }); } } } int ret = -1; for (int i = 0; i <= K; ++i) { if (dis[N - 1][M - 1][i] == 0) continue; if (ret == -1) { ret = dis[N - 1][M - 1][i]; } else if (ret > dis[N - 1][M - 1][i]) { ret = dis[N - 1][M - 1][i]; } } return ret; } int main() { cin >> N >> M >> K; for (int i = 0; i < N; ++i) cin >> map[i]; cout << BFS() << "\n"; return 0; }