/*
一个很不错的bfs 要注意先走不花时间的路径 这样才能使bfs栈中按时间顺序排列
*/
#include<cstdio>
#include<cstring>int r,c,n;
char a[1010][1010],vis[1010][1010];
int rs,cs,rd,cd;
int dir[3][9] = {{-1,-1,0,1,1,1,0,-1},{0,1,1,1,0,-1,-1,-1}};
struct OC
{
int x,y;
int step;
} f[1010*1010];
int bfs()
{
memset(vis,0,sizeof(vis));
memset(f,0,sizeof(f));
int front = 0,rear = 1,nx,ny;
f[0].x = rs;
f[0].y = cs;
f[0].step = 0;
vis[f[0].x][f[0].y] = 1;
OC tmp,now,temp;
while(front<rear)
{
now = f[front];
tmp = now;
if(rd==f[front].x&&cd==f[front].y)
{
printf("%d\n",f[front].step);
return 0;
}
while(1)
{
int ti = a[tmp.x][tmp.y];
nx = tmp.x + dir[0][ti];
ny = tmp.y + dir[1][ti];
if(!vis[nx][ny]&&nx>=1&&nx<=r&&ny>0&&ny<=c)
{
if(rd==nx&&cd==ny)
{
printf("%d\n",tmp.step);
return 0;
}
temp.step = tmp.step;
temp.x = nx;
temp.y = ny;
vis[nx][ny]=1;
f[rear] = temp;
tmp = temp;
rear++;
}
else break;
}
for(int i = 0; i < 8; i++)
{
nx = now.x + dir[0][i];
ny = now.y + dir[1][i];
if(!vis[nx][ny]&&nx>=1&&nx<=r&&ny>0&&ny<=c)
{
if(i!=a[now.x][now.y])
temp.step = now.step+1;
else
temp.step = now.step;
if(rd==nx&&cd==ny)
{
//printf("%d %d %d\n",tmp.x,tmp.y,i);
printf("%d\n",temp.step);
return 0;
}
temp.x = nx;
temp.y = ny;
f[rear] = temp;
vis[nx][ny]=1;
rear++;
tmp = temp;
while(1)
{
int ti = a[tmp.x][tmp.y];
nx = tmp.x + dir[0][ti];
ny = tmp.y + dir[1][ti];
if(!vis[nx][ny]&&nx>=1&&nx<=r&&ny>0&&ny<=c)
{
if(rd==nx&&cd==ny)
{
printf("%d\n",tmp.step);
return 0;
}
f[rear].step = tmp.step;
f[rear].x = nx;
f[rear].y = ny;
vis[nx][ny]=1;
tmp = f[rear];
rear++;
}
else break;
}
}
}
front++;
}
}
int main()
{
char s[1010];
while(scanf("%d %d",&r,&c)==2)
{
for(int i = 1; i <= r; i++)
{
scanf("%s",s);
int l = strlen(s);
for(int j = 0; j < l; j++)
a[i][j+1] = s[j]-'0';
}
scanf("%d",&n);
while(n--)
{
scanf("%d %d %d %d",&rs,&cs,&rd,&cd);
bfs();
}
}
return 0;
}