using System;
using System.Text;
using System.Linq;
using System.Collections;
using System.Collections.Generic;


class Program {

	static int testN = 3;
	static long mod = 1000000007;
	//static long mod =998244353; 
	static System.IO.StringReader sr;
		static void Main(string[] args) {
			char[] cs = new char[] { ' ' };
			//char[] cs = new char[] { ' ', ',' };

			//int n = int.Parse(Console.ReadLine());
			//int val = int.Parse(Console.ReadLine());
			//int[] vals = parseAry(Console.ReadLine().Split(cs));
			//string str = Console.ReadLine();
			//string[] strs = Console.ReadLine().Split(cs);

			//string res = "";
			int res = -1;

			string[] rl = Console.ReadLine().Split(cs);
			int ylen = int.Parse(rl[0]);
			int xlen = int.Parse(rl[1]);


			string[] map = new string[ylen];
			for ( int i = 0; i < ylen; i++ ) {
				map[i] = Console.ReadLine();
			}



			int[] dx = { 1, 0 };
			int[] dy = { 0, 1 };
			int[,] count = new int[ylen, xlen];	//[x,y]＝#通過回数

			for ( int i = 0; i < ylen; i++ ) {
				for ( int k = 0; k < xlen; k++ ) {
					count[i, k] = int.MaxValue - 10;
				}
			}

			Queue<Point> qu = new Queue<Point>();

			count[0, 0] = 0;	//初期値マス
			if ( map[0][0] == '#' ) {
				count[0, 0] = 1;
				qu.Enqueue(new Point(1, 0, 0, 0));//最初
			} else {
				qu.Enqueue(new Point(0, 0, 0, 0));//最初
			}

			while ( qu.Count > 0 ) {

				Point temp = qu.Dequeue();
				int nowCnt = (int)count[temp.y, temp.x];
				for ( int i = 0; i < dx.Length; i++ ) {	//2方向のマスを調べる
					int tx = temp.x + dx[i];
					int ty = temp.y + dy[i];
					if ( tx < 0 || xlen <= tx ) { continue; }
					if ( ty < 0 || ylen <= ty ) { continue; }
					if ( map[ty][tx] == '.' ) {
						if ( nowCnt >= count[ty, tx] ) { continue; } else {
							count[ty, tx] = nowCnt;
							qu.Enqueue(new Point(0, tx, ty, nowCnt));
							continue;
						}

					}
					if ( map[ty][tx] == '#' ) {
						if ( temp.type == 0 ) {
							if ( nowCnt + 1 >= count[ty, tx] ) { continue; } else {
								count[ty, tx] = nowCnt + 1;
								qu.Enqueue(new Point(1, tx, ty, nowCnt + 1));
								continue;
							}
						} else if ( temp.type ==1 ) {
							if ( nowCnt >= count[ty, tx] ) { continue; } else {
								count[ty, tx] = nowCnt;
								qu.Enqueue(new Point(1, tx, ty, nowCnt + 1));
								continue;
							}
						
						}

					}
				}
			}
			int min = int.MaxValue;
			for ( int i = 0; i < ylen; i++ ) {
				for ( int k = 0; k < xlen; k++ ) {
					min=Math.Min(count[i, k],min);
				}
			}
			Console.WriteLine(count[ylen-1,xlen-1]);
			return;

		
	}

		struct Point {
			public int type;
			public int x;
			public int y;
			public int mon;
			public Point(int a, int b, int c, int d) {
				type = a;
				x = b;
				y = c;
				mon = d;
			}
		}

	//	文字列strをindex番目からdで上書き
	static string strOverWrite(string str, int i, string s) {
		return str.Remove(i, s.Length).Insert(i, s);
	}

	//　String[]  ----->  int[]
	static int[] parseAry(string[] str) {
		int[] nums = new int[str.Length];
		for ( int i = 0; i < str.Length; i++ ) { nums[i] = int.Parse(str[i]); }
		return nums;
	}
	//　String[]  ----->  long[]
	static long[] parseAryL(string[] str) {
		long[] nums = new long[str.Length];
		for ( int i = 0; i < str.Length; i++ ) { nums[i] = long.Parse(str[i]); }
		return nums;
	}

	//文字列を1文字ずつString[]に入れる
	static string[] strAry(String str) {
		string[] re = new string[str.Length];
		for ( int i = 0; i < str.Length; i++ ) { re[i] = str[i].ToString(); }
		return re;
	}



}

Measured memory_bytes: 13348