#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
using namespace __gnu_pbds;
using namespace std;
#define F first
#define S second
#define pb push_back
#define powerof2 ()
#define mp make_pair
using ll = long long;
const ll M = 1000000007;
const ll M1= 998244353;
using vl = vector<ll>;
using pll =  pair<ll,ll>;
typedef tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag, tree_order_statistics_node_update> is;

ll power(ll x,ll y){
	if(y==0)
		return 1;
	ll res=power(x,y/2);
	res=(res*res);
	if(y&1)
		res=(res*x);
	return res;
}

ll powermod(ll x,ll y,ll mod){
	if(y==0)
		return 1;
	ll res=powermod(x,y/2,mod);
	res=(res*res)%mod;
	if(y&1)
		res=(res*x)%mod;
	return res;
}
/*int n,m2;char s[101];
char mat[501][501];
map<pair<int,int>,vector<pair<int,int>>> m,m1;

void dfs(int i,int j,int in,pair<int,int> p)
{
	int i1=i,j1=j;
	if(s[in]=='\0')
		return;
	if(s[in]=='L')
		j1--;
	else if(s[in]=='R')
		j1++;
	else if(s[in]=='U')
		i1--;
	else
		i1++;
	if(i1<=0||j1<=0||i1>n||j1>m2||mat[i1][j1]=='#')
        {
        	i1=i;
        	j1=j;
        }
        in++;
        m[p].pb({i1,j1});
        dfs(i1,j1,in,p);
}

void dfs1(int i,int j,int co,set<pair<int,int>> &st,pair<int,int> p){
	if(st.find({i,j})!=st.end())
	{
		m1[p].pb({i,j});
		return;
	}
	//if(co!=0){
	m1[p].pb({i,j});
	st.insert({i,j});
	co++;
	pair<int,int> p1=m[{i,j}][m[{i,j}].size()-1];
	dfs1(p1.F,p1.S,co,st,p);
}*/
/*int n,m;
vector<vector<pair<int,int>>> gr;
vector<int> visi;
void dfsgr(int c,int x,vector<ll> &v,int &co)
{
	visi[c]=1;
	v.pb(c);co++;
	for(int i=0;i<gr[c].size();i++)
	{
		if(visi[gr[c][i].F]==0&&gr[c][i].S!=x)
		{
			dfsgr(gr[c][i].F,x,v,co);
		}
	}
}*/
// int n;
// vector<vector<int>> tre;
// vector<int> nsub;
// void dfs(int c,int p){
// 	for(int i=0;i<tre[c].size();i++)
// 	{
// 		if(tre[c][i]!=p)
// 		{
// 			dfs(tre[c][i],c);
// 			nsub[c]+=1+nsub[tre[c][i]];
// 		}
// 	}
// }

string lsfp(string &s)
{
	//cout<<s<<endl;
	int i=0,j=s.size()-1;
	while(i<j)
	{
		if(s[i]==s[j])
		{

			int st=i,en=j;
			//cout<<i<<" "<<j<<endl;
			while(st<en)
			{
				if(s[st]!=s[en])
					break;
				st++;
				en--;
			}
			//cout<<st<<" "<<en<<endl;

			if(s[st]!=s[en]){
				i=0;j--;}
			else
			{
				//cout<<st<<" "<<en<<endl;
				string ans="";
				for(;i<=j;i++)
					ans.pb(s[i]);
				return ans;
			}
		}
		else
			j--;
	}
	string te="";te.pb(s[0]);
	return te;
}
void solve(){
	int n,m;
	cin>>n>>m;
	ll ma[n][m];
	char ch[n][m];
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			ma[i][j]=0;
			cin>>ch[i][j];
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			if(i==0&&j==0){
				if(ch[0][0]=='#')
				ma[0][0]=1;}
			else if(i==0)
			{
				if(ch[i][j]=='#'&&ch[i][j-1]=='.')
		        ma[i][j]=1;
		        ma[i][j]+=ma[i][j-1];
			}
			else if(j==0)
			{
				if(ch[i][j]=='#'&&ch[i-1][j]=='.')
		        ma[i][j]=1;
		        ma[i][j]+=ma[i-1][j];
			}
			else
			{
				ma[i][j]=min((ma[i-1][j]+(ch[i][j]=='#'&&ch[i-1][j]=='.')),(ma[i][j-1]+(ch[i][j]=='#'&&ch[i][j-1]=='.')));
			}
		}
	}
	/*for(int i=0;i<n;i++){
		for(int j=0;j<m;j++)
			cout<<ma[i][j]<<" ";cout<<endl;}
	*/
	cout<<ma[n-1][m-1]<<endl;
}
int main(){
	/*#ifndef ONLINE_JUDGE
	    // for getting input from input.txt


	    freopen("input.txt", "r", stdin);
	    // for writing output to output.txt
	    freopen("output1.txt", "w", stdout);
	#endif*/

	ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    // int t;
    // cin>>t;
    // while(t--)
    solve();
    return 0;
}

Measured memory_bytes: 384