/* Optimal O(n^2) solution to Jumping Haybales. */ import java.util.*; import java.io.*; public class haybales_font { public static void main(String[] args) throws Exception { PrintWriter out = new PrintWriter(System.out); new haybales_font(new FastScanner(System.in), out); out.close(); } int n, k, oo = 987654321; public haybales_font(FastScanner in, PrintWriter out) { n = in.nextInt(); k = in.nextInt(); int[][] dp = new int[n][n]; for (int[] dd : dp) Arrays.fill(dd, oo); MinQueue rowQueue = new MinQueue(); MinQueue[] colQueue = new MinQueue[n]; for (int i=0; i k) rowQueue.poll(); if (colQueue[j].size() > k) colQueue[j].poll(); char c = s.charAt(j); if (c != '#') { dp[i][j] = Math.min(dp[i][j], rowQueue.minValue()+1); dp[i][j] = Math.min(dp[i][j], colQueue[j].minValue()+1); } rowQueue.add(dp[i][j]); colQueue[j].add(dp[i][j]); } } out.printf("%d%n", dp[n-1][n-1] == oo ? -1 : dp[n-1][n-1]); } } class MinQueue { ArrayDeque realQueue; ArrayDeque minDeque; MinQueue() { realQueue = new ArrayDeque<>(); minDeque = new ArrayDeque<>(); } void clear() { realQueue.clear(); minDeque.clear(); } int size() { return realQueue.size(); } void add(int v) { // Maintain the value for the real queue realQueue.addLast(v); // Maintain the gradient for the smallest values possible. while (minDeque.size() > 0 && minDeque.peekLast().intValue() > v) minDeque.pollLast(); minDeque.addLast(v); } int poll() { int result = realQueue.pollFirst(); if (minDeque.peekFirst().intValue() == result) minDeque.pollFirst(); return result; } int minValue() { // Large value on failure. if (realQueue.size() == 0) return 987654321; return minDeque.peekFirst(); } } class FastScanner{ private InputStream stream; private byte[] buf = new byte[1024]; private int curChar; private int numChars; public FastScanner(InputStream stream) { this.stream = stream; } int read() { if (numChars == -1) throw new InputMismatchException(); if (curChar >= numChars){ curChar = 0; try{ numChars = stream.read(buf); } catch (IOException e) { throw new InputMismatchException(); } if (numChars <= 0) return -1; } return buf[curChar++]; } boolean isSpaceChar(int c) { return c==' '||c=='\n'||c=='\r'||c=='\t'||c==-1; } boolean isEndline(int c) { return c=='\n'||c=='\r'||c==-1; } int nextInt() { return Integer.parseInt(next()); } long nextLong() { return Long.parseLong(next()); } double nextDouble() { return Double.parseDouble(next()); } String next(){ int c = read(); while (isSpaceChar(c)) c = read(); StringBuilder res = new StringBuilder(); do{ res.appendCodePoint(c); c = read(); }while(!isSpaceChar(c)); return res.toString(); } String nextLine(){ int c = read(); while (isEndline(c)) c = read(); StringBuilder res = new StringBuilder(); do{ res.appendCodePoint(c); c = read(); }while(!isEndline(c)); return res.toString(); } }