Ciao Brionix,
questo è il codice completo
#include <iostream>
#include <cstdlib>
using namespace std;
struct vel{int dj;bool p;
vel(): dj(-1),p(false){}
};
struct gri{vel V[4];};
gri G[1000][1000];
int griglia[1000][1000];
int N,M;
char g[4];
void b2(int n,char V[])
{int c=0;
while (n>0)
{V[c]=n%2;
n=n/2;
c++;
}
while(c<4)
{V[c]=0;
c++;
}
}
void gril(int i,int j,int N,int M,int a)
{int temp,te,t;
if(a==0)
{//cout<<G[i][j].V[0].q<<" ";
//cout<<G[i][j].V[0].q<<" ";
if(j-1>=0&&(G[i][j-1].V[1].dj==-1 || G[i][j-1].V[1].dj>G[i][j].V[0].dj+1))
{G[i][j-1].V[1].dj=G[i][j].V[0].dj+1;
//cout<<i<<j<<endl;
temp=j-1;
t=1;
gril(i,temp,N,M,t);
}
if(j-1>=0&&(G[i][j-1].V[3].dj==-1 || G[i][j-1].V[3].dj>G[i][j].V[0].dj+1))
if(G[i][j].V[3].p==false || G[i][j-1].V[1].p==false)
{G[i][j-1].V[3].dj=G[i][j].V[0].dj+1;
temp=j-1;
//cout<<G[i][j-1].V[3].dj<<endl;
t=3;
gril(i,temp,N,M,t);
}
if(j-1>=0&&i-1>=0&&(G[i-1][j-1].V[3].dj==-1||G[i-1][j-1].V[3].dj>G[i][j].V[0].dj+1))
{G[i-1][j-1].V[3].dj=G[i][j].V[0].dj+1;
//cout<<G[i-1][j-1].V[3].dj<<endl;
temp=i-1; te=j-1;
t=3;
gril(temp,te,N,M,t);
}
if(i-1>=0&&(G[i-1][j].V[2].dj==-1||G[i-1][j].V[2].dj>G[i][j].V[0].dj+1))
{G[i-1][j].V[2].dj=G[i][j].V[0].dj+1;
//cout<<G[i-1][j].V[2].dj<<endl;
temp=i-1; t=2;
gril(temp,j,N,M,t);
}
if(i-1>=0&&(G[i-1][j].V[3].dj==-1||G[i-1][j].V[3].dj>G[i][j].V[0].dj+1))
if(G[i][j].V[0].p==false||G[i-1][j].V[2].p==false)
{G[i-1][j].V[3].dj=G[i][j].V[0].dj+1;
//cout<<G[i-1][j].V[3].dj<<endl;
temp=i-1;t=3;
gril(temp,j,N,M,t);
}
t=1;
if(G[i][j].V[0].p==false&&G[i][j].V[1].dj==-1)
gril(i,j,N,M,t);
else if(G[i][j].V[1].dj>G[i][j].V[0].dj)
{G[i][j].V[1].dj=G[i][j].V[0].dj;
gril(i,j,N,M,t);
}
t=2;
if(G[i][j].V[3].p==false&&G[i][j].V[2].dj==-1)
gril(i,j,N,M,t);
else if(G[i][j].V[2].dj>G[i][j].V[0].dj)
{G[i][j].V[2].dj=G[i][j].V[0].dj;
gril(i,j,N,M,t);
}
}
if(a==1)
{//cout<<G[i][j].V[1].q<<" ";
//cout<<G[i][j].V[1].q<<" ";
if(i-1>=0&&j+1<M&&(G[i-1][j+1].V[2].dj==-1||G[i-1][j+1].V[2].dj>G[i][j].V[1].dj+1))
{G[i-1][j+1].V[2].dj=G[i][j].V[1].dj+1;
temp=i-1; te=j+1; t=2;
gril(temp,te,N,M,t);
}
if(j+1<M&&(G[i][j+1].V[0].dj==-1||G[i][j+1].V[0].dj>G[i][j].V[1].dj+1))
{G[i][j+1].V[0].dj=G[i][j].V[1].dj+1;
temp=j+1;
t=0;
gril(i,temp,N,M,t);
}
if(j+1<M&&(G[i][j+1].V[2].dj==-1||G[i][j+1].V[2].dj>G[i][j].V[1].dj+1))
if(G[i][j].V[1].p==false||G[i][j+1].V[3].p==false)
{G[i][j+1].V[2].dj=G[i][j].V[1].dj+1;
temp=j+1;
t=2;
gril(i,temp,N,M,t);
}
if(i-1>=0&&(G[i-1][j].V[3].dj==-1||G[i-1][j].V[3].dj>G[i][j].V[1].dj+1))
{G[i-1][j].V[3].dj=G[i][j].V[1].dj+1;
temp=i-1;
t=3;
gril(temp,j,N,M,t);
}
if(i-1>=0&&(G[i-1][j].V[2].dj==-1||G[i-1][j].V[2].dj>G[i][j].V[1].dj+1))
if(G[i][j].V[0].p==false||G[i-1][j].V[2].p==false)
{G[i-1][j].V[2].dj=G[i][j].V[1].dj+1;
temp=i-1; t=2;
gril(temp,j,N,M,t);
}
t=3;
if(G[i][j].V[1].p==false&&G[i][j].V[3].dj==-1)
gril(i,j,N,M,t);
else if(G[i][j].V[3].dj>G[i][j].V[1].dj)
{G[i][j].V[3].dj=G[i][j].V[1].dj;
gril(i,j,N,M,t);
}
t=0;
if(G[i][j].V[0].p==false&&G[i][j].V[0].dj==-1)
gril(i,j,N,M,t);
else if(G[i][j].V[0].dj>G[i][j].V[1].dj)
{G[i][j].V[0].dj=G[i][j].V[1].dj;
gril(i,j,N,M,t);
}
}
if(a==2)
{//cout<<G[i][j].V[2].q<<" "; G[i][j].V[2].q=true;
//cout<<G[i][j].V[2].q<<" ";
if(i+1<N&&j-1>=0&&(G[i+1][j-1].V[1].dj==-1||G[i+1][j-1].V[1].dj>G[i][j].V[2].dj+1))
{G[i+1][j-1].V[1].dj=G[i][j].V[2].dj+1;
temp=i+1; te=j-1; t=1;
gril(temp,te,N,M,t);
}
if(i+1<N&&(G[i+1][j].V[0].dj==-1||G[i+1][j].V[0].dj>G[i][j].V[2].dj+1))
{G[i+1][j].V[0].dj=G[i][j].V[2].dj+1;
temp=i+1; t=0;
gril(temp,j,N,M,t);
}
if(i+1<N&&(G[i+1][j].V[1].dj==-1||G[i+1][j].V[1].dj>G[i][j].V[2].dj+1))
if(G[i][j].V[2].p==false||G[i+1][j].V[0].p==false)
{G[i+1][j].V[1].dj=G[i][j].V[2].dj+1;
temp=i+1; t=1;
gril(temp,j,N,M,t);
}
if(j-1>=0&&(G[i][j-1].V[3].dj==-1||G[i][j-1].V[3].dj>G[i][j].V[2].dj+1))
{G[i][j-1].V[3].dj=G[i][j].V[2].dj+1;
temp=j-1; t=3;
gril(i,temp,N,M,t);
}
if(j-1>=0&&(G[i][j-1].V[1].dj==-1||G[i][j-1].V[1].dj>G[i][j].V[2].dj+1))
if(G[i][j].V[3].p==false||G[i][j-1].V[1].p==false)
{G[i][j-1].V[1].dj=G[i][j].V[2].dj+1;
temp=j-1; t=1;
gril(i,temp,N,M,t);
}
t=0;
if(G[i][j].V[3].p==false&&G[i][j].V[0].dj==-1)
gril(i,j,N,M,t);
else if(G[i][j].V[0].dj>G[i][j].V[2].dj)
{G[i][j].V[0].dj=G[i][j].V[2].dj;
gril(i,j,N,M,t);
}
t=3;
if(G[i][j].V[2].p==false&&G[i][j].V[3].dj==-1)
gril(i,j,N,M,t);
else if(G[i][j].V[3].dj>G[i][j].V[2].dj)
{G[i][j].V[3].dj=G[i][j].V[2].dj;
gril(i,j,N,M,t);
}
}
if(a==3)
{//cout<<G[i][j].V[3].q<<" ";
//cout<<G[i][j].V[3].q<<" ";
if(i+1<N&&j+1<M&&(G[i+1][j+1].V[0].dj==-1||G[i+1][j+1].V[0].dj>G[i][j].V[3].dj+1))
{G[i+1][j+1].V[0].dj=G[i][j].V[3].dj+1;
temp=i+1; te=j+1; t=0;
gril(temp,te,N,M,t);
}
if(j+1<M&&(G[i][j+1].V[2].dj==-1||G[i][j+1].V[2].dj>G[i][j].V[3].dj+1))
{G[i][j+1].V[2].dj=G[i][j].V[3].dj+1;
temp=j+1; t=2;
gril(i,temp,N,M,t);
}
if(j+1<M&&(G[i][j+1].V[0].dj==-1||G[i][j+1].V[0].dj>G[i][j].V[3].dj+1))
if(G[i][j].V[1].p==false||G[i][j+1].V[3].p==false)
{G[i][j+1].V[0].dj=G[i][j].V[3].dj+1;
temp=j+1; t=0;
gril(i,temp,N,M,t);
}
if(i+1<N&&(G[i+1][j].V[1].dj==-1||G[i+1][j].V[1].dj>G[i][j].V[3].dj+1))
{G[i+1][j].V[1].dj=G[i][j].V[3].dj+1;
temp=i+1; t=1;
gril(temp,j,N,M,t);
}
if(i+1<N&&(G[i+1][j].V[0].dj==-1||G[i+1][j].V[0].dj>G[i][j].V[3].dj+1))
if(G[i][j].V[2].p==false||G[i+1][j].V[0].p==false)
{G[i+1][j].V[0].dj=G[i][j].V[3].dj+1;
temp=i+1; t=0;
gril(temp,j,N,M,t);
}
t=2;
if(G[i][j].V[2].p==false&&G[i][j].V[2].dj==-1)
gril(i,j,N,M,t);
else if(G[i][j].V[2].dj>G[i][j].V[3].dj)
{G[i][j].V[2].dj=G[i][j].V[3].dj;
gril(i,j,N,M,t);
}
t=1;
if(G[i][j].V[1].p==false&&G[i][j].V[1].dj==-1)
gril(i,j,N,M,t);
else if(G[i][j].V[1].dj>G[i][j].V[3].dj)
{G[i][j].V[1].dj=G[i][j].V[3].dj;
gril(i,j,N,M,t);
}
}
}
int cammina(int N,int M,int griglia[][1000])
{int i,j;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{b2(griglia[i][j],g);
if(g[0]==1)
G[i][j].V[0].p=true;
if(g[1]==1)
G[i][j].V[1].p=true;
if(g[2]==1)
G[i][j].V[2].p=true;
if(g[3]==1)
G[i][j].V[3].p=true;
}
G[0][0].V[0].dj=1;
G[0][0].V[1].dj=1;
G[0][0].V[2].dj=1;
G[0][0].V[3].dj=1;
gril(0,0,N,M,0);
//cout<<G[i][j].V[3].dj<<" ";
return G[N+1][M+1].V[3].dj;
}
int main(){int i,j;
cin>>N;
cin>>M;
for(i=0;i<N;i++)
for(j=0;j<M;j++)
cin>>griglia[i][j];
G[N-1][M-1].V[3].dj=-1;
cout<<cammina(N,M,griglia);
system("PAUSE");
}