### BUGGY CODE ###

import sys
from collections import deque
sys.setrecursionlimit(1000*1000)

H,W = map(int,list(input().split()))
grid = []
for i in range(H):
  S = input()
  grid.append( [S[i] for i in range(W) ])

#方向ベクトル 今回は右と下への移動のみを考える　
#つまり行と列番号を増やす向きのみ考える
dx = [1,0]
dy = [0,1]

#####白マスの中を泳ぐdfsの定義
def wdfs(h,w,grid,seen,l_b):
  #白マスの時にかぎり以下を行う
  if grid[h][w] == ".":
    seen[h][w] = True
    for i in range(2):
      new_h = h + dy[i]
      new_w = w + dx[i]

      #場外アウトしたり、移動先が壁の場合はスルー
      if (new_h<0 or new_w <0 or new_h>=H or new_w >= W ):
        continue
      #移動先が黒マスの時はスルー
      elif grid[new_h][new_w] == "#":
        l_b.append([new_h,new_w])
        continue
      #移動先が探索済みの場合スルー
      elif seen[new_h][new_w] == True:
        continue
      wdfs(new_h,new_w,grid,seen,l_b)  
  #最初のマスが黒かった時    
  else:
    l_b.append([h,w])           
#####dfsの定義

#####黒マスの中を泳ぐdfsの定義
def bdfs(h,w,grid,seen,l_w):
  seen[h][w] = True

  for i in range(2):
    new_h = h + dy[i]
    new_w = w + dx[i]

    #場外アウトの場合はスルー
    if (new_h<0 or new_w <0 or new_h>=H or new_w >= W ):
      continue
    #移動先が白マスの時はスルー
    elif grid[new_h][new_w] == ".":
      l_w.append([new_h,new_w])
      continue
    #移動先が探索済みの場合スルー
    elif seen[new_h][new_w] == True:
      continue
    bdfs(new_h,new_w,grid,seen,l_w)  
#####dfsの定義

#探索
seen = [ [False for i in range(W)] for i in range(H) ]
cnt = 0
l_w =deque( [[0,0]] )
l_b =deque([])


while seen[H-1][W-1] == False:
  while len(l_w) > 0: 
    w = l_w.popleft()
    wdfs(w[0],w[1],grid,seen,l_b)
  if seen[H-1][W-1] == True:
    break

  cnt = cnt+1

  while len(l_b) > 0: 
    b = l_b.popleft()
    bdfs(b[0],b[1],grid,seen,l_w)
  if seen[H-1][W-1] == True:
    break

###
print(cnt)

### FIXED CODE ###

import sys
from collections import deque
sys.setrecursionlimit(1000*1000)

H,W = map(int,list(input().split()))
grid = []
for i in range(H):
  S = input()
  grid.append( [S[i] for i in range(W) ])

#方向ベクトル 今回は右と下への移動のみを考える　
#つまり行と列番号を増やす向きのみ考える
dx = [1,0]
dy = [0,1]

#####白マスの中を泳ぐdfsの定義
def wdfs(h,w,grid,seen,l_b):
  #白マスの時にかぎり以下を行う
  if seen[h][w] == False and grid[h][w] == ".":
    seen[h][w] = True
    for i in range(2):
      new_h = h + dy[i]
      new_w = w + dx[i]

      #場外アウトしたり、移動先が壁の場合はスルー
      if (new_h<0 or new_w <0 or new_h>=H or new_w >= W ):
        continue
      #移動先が黒マスの時はスルー
      elif grid[new_h][new_w] == "#":
        l_b.append([new_h,new_w])
        continue
      #移動先が探索済みの場合スルー
      elif seen[new_h][new_w] == True:
        continue
      wdfs(new_h,new_w,grid,seen,l_b)  
  #最初のマスが黒かった時    
  else:
    l_b.append([h,w])           
#####dfsの定義

#####黒マスの中を泳ぐdfsの定義
def bdfs(h,w,grid,seen,l_w):
  if seen[h][w] == False:
    seen[h][w] = True
    
    for i in range(2):
      new_h = h + dy[i]
      new_w = w + dx[i]

      #場外アウトの場合はスルー
      if (new_h<0 or new_w <0 or new_h>=H or new_w >= W ):
        continue
      #移動先が白マスの時はスルー
      elif grid[new_h][new_w] == ".":
        l_w.append([new_h,new_w])
        continue
      #移動先が探索済みの場合スルー
      elif seen[new_h][new_w] == True:
        continue
      bdfs(new_h,new_w,grid,seen,l_w)  
#####dfsの定義

#探索
seen = [ [False for i in range(W)] for i in range(H) ]
cnt = 0
l_w =deque( [[0,0]] )
l_b =deque([])


while seen[H-1][W-1] == False:
  while len(l_w) > 0: 
    w = l_w.popleft()
    wdfs(w[0],w[1],grid,seen,l_b)
  if seen[H-1][W-1] == True:
    break

  cnt = cnt+1

  while len(l_b) > 0: 
    b = l_b.popleft()
    bdfs(b[0],b[1],grid,seen,l_w)
  if seen[H-1][W-1] == True:
    break

###
print(cnt)