using System; using static System.Console; using System.Linq; using System.Collections.Generic; using System.Runtime.Intrinsics.Arm; class Program { static int NN => int.Parse(ReadLine()); static int[] NList => ReadLine().Split().Select(int.Parse).ToArray(); static string[] SList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => ReadLine()).ToArray(); public static void Main() { Solve(); } static void Solve() { var c = NList; var (h, w) = (c[0], c[1]); var s = SList(h); var lh = h * 2 - 1; var lw = w * 2 - 1; var len = new int[lh, lw]; var INF = int.MaxValue / 2; for (var i = 0; i < lh; ++i) for (var j = 0; j < lw; ++j) len[i, j] = INF; len[0, 0] = 0; var q = new Queue<(int x, int y)>(); q.Enqueue((0, 0)); var mx = new int[] { -1, 1, 0, 0 }; var my = new int[] { 0, 0, -1, 1 }; while (q.Count > 0) { var cur = q.Dequeue(); for (var i = 0; i < 4; ++i) { var nx = cur.x + mx[i]; var ny = cur.y + my[i]; if (nx < 0 || nx >= lh || ny < 0 || ny >= lw) continue; if (len[nx, ny] <= len[cur.x, cur.y] + 1) continue; if (nx % 2 == 0 && ny % 2 == 0 && s[nx / 2][ny / 2] == '#') continue; len[nx, ny] = len[cur.x, cur.y] + 1; q.Enqueue((nx, ny)); } if (cur.x % 2 == 0) { var nx = cur.x - 2; if (0 <= nx && len[nx, cur.y] > len[cur.x, cur.y] + 1 && (cur.y % 2 == 1 || s[nx / 2][cur.y / 2] != '#')) { len[nx, cur.y] = len[cur.x, cur.y] + 1; q.Enqueue((nx, cur.y)); } nx = cur.x + 2; if (nx < lh && len[nx, cur.y] > len[cur.x, cur.y] + 1 && (cur.y % 2 == 1 || s[nx / 2][cur.y / 2] != '#')) { len[nx, cur.y] = len[cur.x, cur.y] + 1; q.Enqueue((nx, cur.y)); } } if (cur.y % 2 == 0) { var ny = cur.y - 2; if (0 <= ny && len[cur.x, ny] > len[cur.x, cur.y] + 1 && (cur.x % 2 == 1 || s[cur.x / 2][ny / 2] != '#')) { len[cur.x, ny] = len[cur.x, cur.y] + 1; q.Enqueue((cur.x, ny)); } ny = cur.y + 2; if (ny < lw && len[cur.x, ny] > len[cur.x, cur.y] + 1 && (cur.x % 2 == 1 || s[cur.x / 2][ny / 2] != '#')) { len[cur.x, ny] = len[cur.x, cur.y] + 1; q.Enqueue((cur.x, ny)); } } } WriteLine(len[lh - 1, lw - 1]); } }