#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
struct dimcomp3{
int B;
int C;
dimcomp3( ) {
}
;
dimcomp3( int b, int c) {
B = b;
C = c;
}
dimcomp3( int a, int b, int c) {
B = b;
C = c;
}
inline void set( int b, int c) {
B = b;
C = c;
}
inline void set( int a, int b, int c) {
B = b;
C = c;
}
inline int mask( int a, int b, int c) {
return ( a * B + b) * C + c;
}
inline int operator( ) ( int a, int b, int c) {
return ( a * B + b) * C + c;
}
inline void para( int mask, int & a, int & b, int & c) {
a = mask / ( B* C) ;
b = mask % ( B* C) / C;
c = mask % C;
}
inline void operator( ) ( int mask, int & a, int & b, int & c) {
a = mask / ( B* C) ;
b = mask % ( B* C) / C;
c = mask % C;
}
}
;
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
int N;
int q[ 20000 ] ;
int qs;
int qe;
int d[ 2 ] [ 100 ] [ 100 ] ;
int ok[ 2 ] [ 100 ] [ 100 ] ;
class Solution{
public :
int minimumMoves( vector< vector< int >> & mp) {
int i;
int j;
int k;
int mask;
int ni;
int nj;
int nk;
int r;
dimcomp3 c;
N = mp.size ( ) ;
c.set ( 2 ,N,N) ;
for ( k= ( 0 ) ; k< ( 2 ) ; k++ ) {
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
for ( j= ( 0 ) ; j< ( N) ; j++ ) {
d[ k] [ i] [ j] = - 1 ;
}
}
}
d[ 0 ] [ 0 ] [ 0 ] = 0 ;
qs = qe = 0 ;
q[ qe++ ] = 0 ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
for ( j= ( 0 ) ; j< ( N) ; j++ ) {
ok[ 0 ] [ i] [ j] = ok[ 1 ] [ i] [ j] = 0 ;
}
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
for ( j= ( 0 ) ; j< ( N- 1 ) ; j++ ) {
if ( mp[ i] [ j] == mp[ i] [ j+ 1 ] && mp[ i] [ j+ 1 ] == 0 ) {
ok[ 0 ] [ i] [ j] = 1 ;
}
}
}
for ( i= ( 0 ) ; i< ( N- 1 ) ; i++ ) {
for ( j= ( 0 ) ; j< ( N) ; j++ ) {
if ( mp[ i] [ j] == mp[ i+ 1 ] [ j] && mp[ i+ 1 ] [ j] == 0 ) {
ok[ 1 ] [ i] [ j] = 1 ;
}
}
}
while ( qs < qe) {
mask = q[ qs++ ] ;
c( mask,k,i,j) ;
for ( r= ( 0 ) ; r< ( 3 ) ; r++ ) {
if ( r== 0 ) {
nk = k^ 1 ;
}
else {
nk = k;
}
if ( r== 1 ) {
ni = i+ 1 ;
}
else {
ni = i;
}
if ( r== 2 ) {
nj = j+ 1 ;
}
else {
nj = j;
}
if ( ni >= N || nj >= N) {
continue ;
}
if ( ok[ nk] [ ni] [ nj] && d[ nk] [ ni] [ nj] == - 1 ) {
if ( r== 0 && mp[ ni+ 1 ] [ nj+ 1 ] == 1 ) {
continue ;
}
d[ nk] [ ni] [ nj] = d[ k] [ i] [ j] + 1 ;
q[ qe++ ] = c( nk,ni,nj) ;
}
}
}
return d[ 0 ] [ N- 1 ] [ N- 2 ] ;
}
}
;
// cLay varsion 20191006-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int N;
// int q[20000], qs, qe;
// int d[2][100][100];
// int ok[2][100][100];
//
// class Solution {
// public:
// int minimumMoves(vector<vector<int>>& mp) {
// int i, j, k, mask, ni, nj, nk, r;
// dimcomp3 c;
// N = mp.size();
// c.set(2,N,N);
//
// rep(k,2) rep(i,N) rep(j,N) d[k][i][j] = -1;
// d[0][0][0] = 0;
// qs = qe = 0;
// q[qe++] = 0;
//
// rep(i,N) rep(j,N) ok[0][i][j] = ok[1][i][j] = 0;
// rep(i,N) rep(j,N-1) if(mp[i][j]==mp[i][j+1]==0) ok[0][i][j] = 1;
// rep(i,N-1) rep(j,N) if(mp[i][j]==mp[i+1][j]==0) ok[1][i][j] = 1;
//
// while(qs < qe){
// mask = q[qs++];
// c(mask,k,i,j);
//
// rep(r,3){
// nk = if[r==0, k^1, k];
// ni = if[r==1, i+1, i];
// nj = if[r==2, j+1, j];
// if(ni >= N || nj >= N) continue;
// if(ok[nk][ni][nj] && d[nk][ni][nj]==-1){
// if(r==0 && mp[ni+1][nj+1]==1) continue;
// d[nk][ni][nj] = d[k][i][j] + 1;
// q[qe++] = c(nk,ni,nj);
// }
// }
// }
//
// return d[0][N-1][N-2];
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnN0cnVjdCBkaW1jb21wM3sKICBpbnQgQjsKICBpbnQgQzsKICBkaW1jb21wMygpewogIH0KICA7CiAgZGltY29tcDMoaW50IGIsIGludCBjKXsKICAgIEIgPSBiOwogICAgQyA9IGM7CiAgfQogIGRpbWNvbXAzKGludCBhLCBpbnQgYiwgaW50IGMpewogICAgQiA9IGI7CiAgICBDID0gYzsKICB9CiAgaW5saW5lIHZvaWQgc2V0KGludCBiLCBpbnQgYyl7CiAgICBCID0gYjsKICAgIEMgPSBjOwogIH0KICBpbmxpbmUgdm9pZCBzZXQoaW50IGEsIGludCBiLCBpbnQgYyl7CiAgICBCID0gYjsKICAgIEMgPSBjOwogIH0KICBpbmxpbmUgaW50IG1hc2soaW50IGEsIGludCBiLCBpbnQgYyl7CiAgICByZXR1cm4gKGEgKiBCICsgYikgKiBDICsgYzsKICB9CiAgaW5saW5lIGludCBvcGVyYXRvcigpKGludCBhLCBpbnQgYiwgaW50IGMpewogICAgcmV0dXJuIChhICogQiArIGIpICogQyArIGM7CiAgfQogIGlubGluZSB2b2lkIHBhcmEoaW50IG1hc2ssIGludCAmYSwgaW50ICZiLCBpbnQgJmMpewogICAgYSA9IG1hc2sgLyAoQipDKTsKICAgIGIgPSBtYXNrICUgKEIqQykgLyBDOwogICAgYyA9IG1hc2sgJSBDOwogIH0KICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKGludCBtYXNrLCBpbnQgJmEsIGludCAmYiwgaW50ICZjKXsKICAgIGEgPSBtYXNrIC8gKEIqQyk7CiAgICBiID0gbWFzayAlIChCKkMpIC8gQzsKICAgIGMgPSBtYXNrICUgQzsKICB9Cn0KOwojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCmludCBOOwppbnQgcVsyMDAwMF07CmludCBxczsKaW50IHFlOwppbnQgZFsyXVsxMDBdWzEwMF07CmludCBva1syXVsxMDBdWzEwMF07CmNsYXNzIFNvbHV0aW9uewogIHB1YmxpYzoKICBpbnQgbWluaW11bU1vdmVzKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIG1wKXsKICAgIGludCBpOwogICAgaW50IGo7CiAgICBpbnQgazsKICAgIGludCBtYXNrOwogICAgaW50IG5pOwogICAgaW50IG5qOwogICAgaW50IG5rOwogICAgaW50IHI7CiAgICBkaW1jb21wMyBjOwogICAgTiA9IG1wLnNpemUoKTsKICAgIGMuc2V0KDIsTixOKTsKICAgIGZvcihrPSgwKTtrPCgyKTtrKyspewogICAgICBmb3IoaT0oMCk7aTwoTik7aSsrKXsKICAgICAgICBmb3Ioaj0oMCk7ajwoTik7aisrKXsKICAgICAgICAgIGRba11baV1bal0gPSAtMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGRbMF1bMF1bMF0gPSAwOwogICAgcXMgPSBxZSA9IDA7CiAgICBxW3FlKytdID0gMDsKICAgIGZvcihpPSgwKTtpPChOKTtpKyspewogICAgICBmb3Ioaj0oMCk7ajwoTik7aisrKXsKICAgICAgICBva1swXVtpXVtqXSA9IG9rWzFdW2ldW2pdID0gMDsKICAgICAgfQogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGZvcihqPSgwKTtqPChOLTEpO2orKyl7CiAgICAgICAgaWYobXBbaV1bal09PW1wW2ldW2orMV0gJiYgbXBbaV1baisxXT09MCl7CiAgICAgICAgICBva1swXVtpXVtqXSA9IDE7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmb3IoaT0oMCk7aTwoTi0xKTtpKyspewogICAgICBmb3Ioaj0oMCk7ajwoTik7aisrKXsKICAgICAgICBpZihtcFtpXVtqXT09bXBbaSsxXVtqXSAmJiBtcFtpKzFdW2pdPT0wKXsKICAgICAgICAgIG9rWzFdW2ldW2pdID0gMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHdoaWxlKHFzIDwgcWUpewogICAgICBtYXNrID0gcVtxcysrXTsKICAgICAgYyhtYXNrLGssaSxqKTsKICAgICAgZm9yKHI9KDApO3I8KDMpO3IrKyl7CiAgICAgICAgaWYocj09MCl7CiAgICAgICAgICBuayA9a14xOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgbmsgPWs7CiAgICAgICAgfQogICAgICAgIGlmKHI9PTEpewogICAgICAgICAgbmkgPWkrMTsKICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgIG5pID1pOwogICAgICAgIH0KICAgICAgICBpZihyPT0yKXsKICAgICAgICAgIG5qID1qKzE7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICBuaiA9ajsKICAgICAgICB9CiAgICAgICAgaWYobmkgPj0gTiB8fCBuaiA+PSBOKXsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZihva1tua11bbmldW25qXSAmJiBkW25rXVtuaV1bbmpdPT0tMSl7CiAgICAgICAgICBpZihyPT0wICYmIG1wW25pKzFdW25qKzFdPT0xKXsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBkW25rXVtuaV1bbmpdID0gZFtrXVtpXVtqXSArIDE7CiAgICAgICAgICBxW3FlKytdID0gYyhuayxuaSxuaik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZFswXVtOLTFdW04tMl07CiAgfQp9CjsKLy8gY0xheSB2YXJzaW9uIDIwMTkxMDA2LTEKCi8vIC0tLSBvcmlnaW5hbCBjb2RlIC0tLQovLyAjZGVmaW5lIG1haW4gZHVtbXlfbWFpbgovLyB7fQovLyAjdW5kZWYgbWFpbgovLyAKLy8gaW50IE47Ci8vIGludCBxWzIwMDAwXSwgcXMsIHFlOwovLyBpbnQgZFsyXVsxMDBdWzEwMF07Ci8vIGludCBva1syXVsxMDBdWzEwMF07Ci8vIAovLyBjbGFzcyBTb2x1dGlvbiB7Ci8vIHB1YmxpYzoKLy8gICBpbnQgbWluaW11bU1vdmVzKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIG1wKSB7Ci8vICAgICBpbnQgaSwgaiwgaywgbWFzaywgbmksIG5qLCBuaywgcjsKLy8gICAgIGRpbWNvbXAzIGM7Ci8vICAgICBOID0gbXAuc2l6ZSgpOwovLyAgICAgYy5zZXQoMixOLE4pOwovLyAKLy8gICAgIHJlcChrLDIpIHJlcChpLE4pIHJlcChqLE4pIGRba11baV1bal0gPSAtMTsKLy8gICAgIGRbMF1bMF1bMF0gPSAwOwovLyAgICAgcXMgPSBxZSA9IDA7Ci8vICAgICBxW3FlKytdID0gMDsKLy8gCi8vICAgICByZXAoaSxOKSByZXAoaixOKSBva1swXVtpXVtqXSA9IG9rWzFdW2ldW2pdID0gMDsKLy8gICAgIHJlcChpLE4pIHJlcChqLE4tMSkgaWYobXBbaV1bal09PW1wW2ldW2orMV09PTApIG9rWzBdW2ldW2pdID0gMTsKLy8gICAgIHJlcChpLE4tMSkgcmVwKGosTikgaWYobXBbaV1bal09PW1wW2krMV1bal09PTApIG9rWzFdW2ldW2pdID0gMTsKLy8gCi8vICAgICB3aGlsZShxcyA8IHFlKXsKLy8gICAgICAgbWFzayA9IHFbcXMrK107Ci8vICAgICAgIGMobWFzayxrLGksaik7Ci8vIAovLyAgICAgICByZXAociwzKXsKLy8gICAgICAgICBuayA9IGlmW3I9PTAsIGteMSwga107Ci8vICAgICAgICAgbmkgPSBpZltyPT0xLCBpKzEsIGldOwovLyAgICAgICAgIG5qID0gaWZbcj09MiwgaisxLCBqXTsKLy8gICAgICAgICBpZihuaSA+PSBOIHx8IG5qID49IE4pIGNvbnRpbnVlOwovLyAgICAgICAgIGlmKG9rW25rXVtuaV1bbmpdICYmIGRbbmtdW25pXVtual09PS0xKXsKLy8gICAgICAgICAgIGlmKHI9PTAgJiYgbXBbbmkrMV1bbmorMV09PTEpIGNvbnRpbnVlOwovLyAgICAgICAgICAgZFtua11bbmldW25qXSA9IGRba11baV1bal0gKyAxOwovLyAgICAgICAgICAgcVtxZSsrXSA9IGMobmssbmksbmopOwovLyAgICAgICAgIH0KLy8gICAgICAgfQovLyAgICAgfQovLyAKLy8gICAgIHJldHVybiBkWzBdW04tMV1bTi0yXTsKLy8gICB9Ci8vIH07Cg==