#include <iostream>
#include <queue>
using namespace std;
/*
N,M์ ํต์์ ์ธ ์์น๋ก x,y๋ก ์ผ๋ค๊ฐ ๋ฐ๋๋ผ๋ ๊ฑธ ์์ ๋ฅผ ๋๋ฆฌ๋ค๊ฐ ์์๋ค. ๋ฌธ์ ๋ฅผ ์์ธํ๊ฒ ๋ณด์.
*/
int N,M;
int map[101][101];
int visited[101][101];
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
int bfs(int x,int y){
visited[y][x]=1;
priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,greater<pair<int,pair<int,int>>>>pq;
pq.push({0,{y,x}});
while(!pq.empty()){
int block=pq.top().first;
int y=pq.top().second.first;
int x=pq.top().second.second;
if(x==M-1&&y==N-1){ //๋ชฉ์ ์ง์ธ (N,M)์ ๋๋ฌํ์ ๋ ์ฆ๋ฃ
return block;
}
pq.pop();
for(int i=0; i<4; i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=0&&nx<M&&ny>=0&&ny<N&&!visited[ny][nx]){ //๋งต์ ๋ฒ์๋ฅผ ๋์ด๊ฐ์ง ์๊ณ , ๋ฐฉ๋ฌธํ์ง ์์์๋
visited[ny][nx]=1; //๋ฐฉ๋ฌธ์ฒ๋ฆฌ
if(map[ny][nx]==0){
pq.push({block,{ny,nx}}); //๋ฒฝ์๋ถ์๊ณ ์ด๋
}
else{
pq.push({block+1,{ny,nx}}); //๋ฒฝ ํ๊ฐ ๋ถ์๊ณ ์ด๋
}
}
}
}
return 0;
}
int main(){
cin>>M>>N;
for(int i=0; i<N; i++){
for(int k=0; k<M; k++){
scanf("%1d",&map[i][k]);
}
}
cout<< bfs(0,0);
}
๋๊ธ