#include<iostream>
#include<stdio.h>
#include<queue>
#include<vector>
#include<string.h>
#define infinity 9999999
#define max 1100
#define temp 0
#define perm 1
using namespace std;
char crnt[max][max];
int dist[max][max];
int status[max][max];
struct st
{
int u;
int v;
int w;
};
struct compare
{
bool operator()(const st& s1,const st& s2)
{
return s1.w>s2.w;
}
};
priority_queue<st,vector<st>,compare > pq;
int adj[][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
int r,c,rs,cs,rd,cd,t;
int is_safe(int x,int y)
{
if(x<1||y<1||x>r||y>c)
return 0;
return 1;
}
void reset_dist()
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
dist[i][j]=999999;
}
}
}
int dijkstra()
{
reset_dist();
dist[rs][cs]=0;int d;
st s1={rs,cs,dist[rs][cs]};
pq.push(s1);
while(!pq.empty())
{
st s1=pq.top();
pq.pop();
status[s1.u][s1.v]=1;
for(int k=0;k<8;k++)
{
int xc=s1.u+adj[k][0];
int yc=s1.v+adj[k][1];
if(is_safe(xc,yc))
{
if(k==crnt[s1.u][s1.v]-'0')
d=dist[s1.u][s1.v];
else
d=dist[s1.u][s1.v]+1;
if(dist[xc][yc]>d)
{
dist[xc][yc]=d;
if(status[xc][yc]==0)
{
st s1={xc,yc,dist[xc][yc]};
pq.push(s1);
}
}
}
}
}
return dist[rd][cd];
}
int main()
{
while(cin>>r>>c)
{
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>crnt[i][j];
}
}
cin>>t;
while(t--)
{
cin>>rs>>cs>>rd>>cd;
memset(status,0,sizeof(status[0][0])*max*max);
cout<<dijkstra()<<"\n";
}
reset_dist();
memset(status,0,sizeof(status[0][0])*max*max);
memset(crnt,' ',sizeof(crnt[0][0])*max*max);
}
return 0;
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHN0ZGlvLmg+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHN0cmluZy5oPgojZGVmaW5lIGluZmluaXR5IDk5OTk5OTkKI2RlZmluZSBtYXggMTEwMAojZGVmaW5lIHRlbXAgMAojZGVmaW5lIHBlcm0gMQp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjaGFyIGNybnRbbWF4XVttYXhdOwppbnQgZGlzdFttYXhdW21heF07CmludCBzdGF0dXNbbWF4XVttYXhdOwpzdHJ1Y3Qgc3QKewoJaW50IHU7CglpbnQgdjsKCWludCB3Owp9OwpzdHJ1Y3QgY29tcGFyZQp7Cglib29sIG9wZXJhdG9yKCkoY29uc3Qgc3QmIHMxLGNvbnN0IHN0JiBzMikKCXsKCQlyZXR1cm4gczEudz5zMi53OwoJfQp9Owpwcmlvcml0eV9xdWV1ZTxzdCx2ZWN0b3I8c3Q+LGNvbXBhcmUgPiBwcTsKaW50IGFkaltdWzJdPXt7LTEsMH0sey0xLDF9LHswLDF9LHsxLDF9LHsxLDB9LHsxLC0xfSx7MCwtMX0sey0xLC0xfX07CmludCByLGMscnMsY3MscmQsY2QsdDsKaW50IGlzX3NhZmUoaW50IHgsaW50IHkpCnsKCWlmKHg8MXx8eTwxfHx4PnJ8fHk+YykKCSAgIHJldHVybiAwOwoJcmV0dXJuIDE7Cn0Kdm9pZCByZXNldF9kaXN0KCkKewoJZm9yKGludCBpPTE7aTw9cjtpKyspCgl7CgkJZm9yKGludCBqPTE7ajw9YztqKyspCgkJewoJCQlkaXN0W2ldW2pdPTk5OTk5OTsKCQl9Cgl9Cn0KaW50IGRpamtzdHJhKCkKewoJcmVzZXRfZGlzdCgpOwoJZGlzdFtyc11bY3NdPTA7aW50IGQ7CglzdCBzMT17cnMsY3MsZGlzdFtyc11bY3NdfTsKCXBxLnB1c2goczEpOwoJd2hpbGUoIXBxLmVtcHR5KCkpCgl7CgkJc3QgczE9cHEudG9wKCk7CgkJcHEucG9wKCk7CgkJc3RhdHVzW3MxLnVdW3MxLnZdPTE7CgkJZm9yKGludCBrPTA7azw4O2srKykKCQl7CgkJCWludCB4Yz1zMS51K2FkaltrXVswXTsKCQkJaW50IHljPXMxLnYrYWRqW2tdWzFdOwoJCQlpZihpc19zYWZlKHhjLHljKSkKCQkJewoJCQkJaWYoaz09Y3JudFtzMS51XVtzMS52XS0nMCcpCgkJCQkgICAgZD1kaXN0W3MxLnVdW3MxLnZdOwoJCQkJZWxzZQoJCQkJICAgIGQ9ZGlzdFtzMS51XVtzMS52XSsxOwoJCQkJaWYoZGlzdFt4Y11beWNdPmQpCgkJCQl7CgkJCQkJZGlzdFt4Y11beWNdPWQ7CgkJCQkJaWYoc3RhdHVzW3hjXVt5Y109PTApCgkJCQkJewoJCQkJCQlzdCBzMT17eGMseWMsZGlzdFt4Y11beWNdfTsKCQkJCQkJcHEucHVzaChzMSk7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCX0KCQl9Cgl9CglyZXR1cm4gZGlzdFtyZF1bY2RdOwp9CgppbnQgbWFpbigpCnsgCiAgICB3aGlsZShjaW4+PnI+PmMpCiAgICB7CiAgICAJCiAgICAJZm9yKGludCBpPTE7aTw9cjtpKyspCiAgICAJewogICAgCQlmb3IoaW50IGo9MTtqPD1jO2orKykKICAgIAkJewogICAgCQkJY2luPj5jcm50W2ldW2pdOwogICAgCQl9CiAgICAJfQogICAgY2luPj50OwogICAgd2hpbGUodC0tKQogICAgewogICAgCWNpbj4+cnM+PmNzPj5yZD4+Y2Q7CiAgICAJbWVtc2V0KHN0YXR1cywwLHNpemVvZihzdGF0dXNbMF1bMF0pKm1heCptYXgpOwogICAgCWNvdXQ8PGRpamtzdHJhKCk8PCJcbiI7CiAgICAJCiAgICB9CiAgICByZXNldF9kaXN0KCk7CiAgICBtZW1zZXQoc3RhdHVzLDAsc2l6ZW9mKHN0YXR1c1swXVswXSkqbWF4Km1heCk7CiAgICBtZW1zZXQoY3JudCwnICcsc2l6ZW9mKGNybnRbMF1bMF0pKm1heCptYXgpOwogIH0KICByZXR1cm4gMDsKICAgIAp9Cgo=