#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <deque>
using namespace std;
typedef long long LL;
typedef pair<int,int>PII;
const int N=2010,M=N*N;
int n,m;
int g[N][N];
int dist[N][N];
bool st[N][N];
int bfs()
{
memset(st,0,sizeof st);
memset(dist,0x3f,sizeof dist);
dist[0][0]=0;
deque<PII>q;
q.push_back({0,0});
int dx[3]={0,0,1},dy[3]={-1,1,0};
while(q.size())
{
auto t=q.front();
q.pop_front();
if(st[t.first][t.second])continue;
st[t.first][t.second]=true;
if(t.first==n-1&&t.second==m-1)break;
for(int i=0;i<3;i++)
{
int a=t.first+dx[i],b=t.second+dy[i];
if(a<0||a>=n||b<0||b>=m)continue;
int u=t.first,v=t.second;
int w=(g[a][b]==g[u][v])?1:2;
int d=dist[t.first][t.second]+w;
if(d<dist[a][b])
{
dist[a][b]=d;
if(w==1)q.push_front({a,b});
else q.push_back({a,b});
}
}
}
return dist[n-1][m-1];
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&g[i][j]);
cout<<bfs()<<endl;
return 0;
}
```