#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <cstring>
#include <math.h>
#include <bitset>
#include <queue>
#include <set>
#include <iomanip>
#include <math.h>
#include <assert.h>
// #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
constexpr long long int INFLL = 1001001001001001LL;
constexpr long long int infll = 1001001001001001LL;
constexpr int INF = 1000000007;
constexpr int inf = 1000000007;
const int mod = 1000000007;

template <class T>
inline bool chmin(T &a, T b)
{
    if (a > b)
    {
        a = b;
        return true;
    }
    return false;
}
template <class T>
inline bool chmax(T &a, T b)
{
    if (a < b)
    {
        a = b;
        return true;
    }
    return false;
}

ll gcd(ll a, ll b)
{
    if (a % b == 0)
    {
        return (b);
    }
    else
    {
        return (gcd(b, a % b));
    }
}

ll lcm(ll a, ll b)
{
    return a / gcd(a, b) * b;
}

inline double nCr(const int n, int r)
{
    if (n == 0)
    {
        return 0;
    }
    if (r == 0)
    {
        return 1;
    }
    if (r == 1)
    {
        return n;
    }
    if (n == r)
    {
        return 1;
    }

    if (r > n / 2)
    {
        r = n / 2;
    }

    double result = 1;
    for (double i = 1; i <= r; i++)
    {
        result *= (n - i + 1) / i;
    }

    return (result);
}

template <typename T>
T seinomi(T a)
{
    if (a > 0)
    {
        return a;
    }
    else
    {
        return 0;
    }
}

template <typename T>
map<T, T> soinsuubunkai(T n) //連想配列[素因数f.first][個数f.second]
{
    map<T, T> ret;
    for (T i = 2; i * i <= n; i++)
    {
        while (n % i == 0)
        {
            ret[i]++;
            n /= i;
        }
    }
    if (n != 1)
        ret[n] = 1;
    return ret;
}

template <typename T>
T ketasuu(T num)
{
    return std::to_string(num).length();
}

int kaizyou(int k)
{
    int sum = 1;
    for (int i = 1; i <= k; ++i)
    {
        sum *= i;
    }
    return sum;
}

template <class ForwardIt, class T>
void iota(ForwardIt first, ForwardIt last, T value)
{
    while (first != last)
    {
        *first++ = value;
        ++value;
    }
}

//nの階乗を計算
int factorial(int n)
{
    int answer = 1;
    while (n > 1)
    {
        answer *= n;
        n--;
    }
    return answer;
}
int comb(int n, int r)
{
    return factorial(n) / (factorial(r) * factorial(n - r));
}

long long modpow(long long a, long long n, long long mod)
{
    long long res = 1;
    while (n > 0)
    {
        if (n & 1)
            res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}


template <typename T>
T amarinasi(T a,T b){
    if(a%b==0)
{
    return a/b;
}
else if(a%b>0)
{
    return a/b+1;
}
else
{
    return a/b-1;
}
}

//小数点以下10桁テンプレート（main関数内の最初に貼付け）
//std::cout << std::fixed << std::setprecision(10);

//----------------------------------------------------------------


int main(){
    ll h,w;
 char a[110][110];
cin>>h>>w;
ll dp1[110][110];
ll dp2[110][110];
ll dp3[110][110];
for(ll i=0;i<h;i++){
    for(ll j=0;j<w;j++){
        cin>>a[i][j];
    }
}

for(ll i=0;i<h;i++){
    for(ll j=0;j<w;j++){
       if(i==0&&j==0){
           if(a[i][j]=='#'){
dp1[i][j]=1;
}else{
    dp1[i][j]=0;
}
       }
        else if(i==0){
            if(a[i][j]=='#'&&a[i][j-1]=='.'){
            dp1[i][j]=dp1[i][j-1]+1;
            }
            else{
                dp1[i][j]=dp1[i][j-1];
            }
        }
        else if(j==0){
            if(a[i][j]=='#'&&a[i-1][j]=='.'){
            dp1[i][j]=dp1[i-1][j]+1;
            }
            else{
                dp1[i][j]=dp1[i-1][j];
            }
        }
        else{
            if(a[i][j]=='#'&&a[i][j-1]=='.'){
            dp1[i][j]=dp1[i][j-1]+1;
        }else{
            dp1[i][j]=dp1[i][j-1];
        }
        if(a[i][j]=='#'&&a[i-1][j]=='.'){
            dp1[i][j]=min(dp1[i][j],dp1[i-1][j]+1);
        }else{
            dp1[i][j]=min(dp1[i][j],dp1[i-1][j]);
        }
        }
    }
 
}

cout<<dp1[h-1][w-1]<<endl;
}









Measured memory_bytes: 384