#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>

using namespace std;

#define MAXN 32
#define MAXV 50010
#define inf (1<<26)

const int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};

struct edge {
	edge *next;
	int t,d;
	edge () {
		next=NULL;
	}
} *head[MAXV];

void AddEdge(int s,int t,int d) {
	edge *p=new(edge);
	p->t=t,p->d=d;
	p->next=head[s];
	head[s]=p;
}

int Map[MAXN][MAXN],n,m,q,ex,ey,sx,sy,tx,ty;
int v[MAXN][MAXN][4],V=0;
int dist[MAXN][MAXN],Move[MAXN][MAXN][4][4];

int Dist[MAXV];
bool f[MAXV];

int S,T;

struct node {
	int x,y;
	node (int _x,int _y):x(_x),y(_y) {
		
	}
};
queue<node>Q;

int Bfs(int Sx,int Sy,int Tx,int Ty) {
	if (Sx==Tx&&Sy==Ty) return 0;
	while (!Q.empty()) Q.pop();
	for (int i=0;i++<n;) {
		for (int j=0;j++<m;) {
			dist[i][j]=inf;
		}
	}
	dist[Sx][Sy]=0;
	Q.push(node(Sx,Sy));
	while (!Q.empty()) {
		node u=Q.front();
		Q.pop();
		for (int i=0;i<4;i++) {
			if (Map[u.x+dir[i][0]][u.y+dir[i][1]]&&dist[u.x+dir[i][0]][u.y+dir[i][1]]==inf) {
				dist[u.x+dir[i][0]][u.y+dir[i][1]]=dist[u.x][u.y]+1;
				if (u.x+dir[i][0]==Tx&&u.y+dir[i][1]==Ty) return dist[u.x][u.y]+1;
				Q.push(node(u.x+dir[i][0],u.y+dir[i][1]));
			}
		}
	}
	return inf;
}

struct Cmp {
	bool operator()(int x,int y) {
		return Dist[x]>Dist[y];
	}
};
priority_queue<int,vector<int>,Cmp>Pq;

int spfa() {
	for (int i=0;i++<V;) Dist[i]=inf;
	memset(f,true,sizeof(f));
	while (!Pq.empty()) Pq.pop();
	Dist[S]=0;
	Pq.push(S);
	while (!Pq.empty()) {
		int u=Pq.top();
		Pq.pop();
		if (!f[u]) continue;
		f[u]=false;
		if (u==T) return Dist[T];
		for (edge *p=head[u];p;p=p->next) {
			if (Dist[p->t]>Dist[u]+p->d) {
				Dist[p->t]=Dist[u]+p->d;
				f[p->t]=true;
				Pq.push(p->t);
			}
		}
	}
	return Dist[T]<inf?Dist[T]:-1;
}

int main() {
	cin>>n>>m>>q;
	memset(Map,0,sizeof(Map));
	for (int i=0;i++<n;) {
		for (int j=0;j++<m;) {
			cin>>Map[i][j];
			for (int k=0;k<4;k++) {
				v[i][j][k]=++V;
			}
		}
	}
	for (int i=0;i++<n;) {
		for (int j=0;j++<m;) {
			for (int k=0;k<4;k++) {
				for (int h=0;h<4;h++) {
					Move[i][j][k][h]=inf;
				}
			}
		}
	}
	for (int i=0;i++<n;) {
		for (int j=0;j++<m;) {
			if (Map[i][j]) {
				Map[i][j]=0;
				for (int k=0;k<4;k++) {
					if (Map[i+dir[k][0]][j+dir[k][1]]) {
						for (int h=0;h<4;h++) {
							if (Map[i+dir[h][0]][j+dir[h][1]]) {
								Move[i][j][k][h]=Bfs(i+dir[k][0],j+dir[k][1],i+dir[h][0],j+dir[h][1])+1;
							}
						}
					}
				}
				Map[i][j]=1;
			}
		}
	}
	memset(head,0,sizeof(head));
	for (int i=0;i++<n;) {
		for (int j=0;j++<m;) {
			for (int k=0;k<4;k++) {
				for (int h=0;h<4;h++) {
					if (Move[i][j][k][h]<inf) {
						AddEdge(v[i][j][k],v[i+dir[h][0]][j+dir[h][1]][h^1],Move[i][j][k][h]);
					}
				}
			}
		}
	}
	while (q--) {
		cin>>ex>>ey>>sx>>sy>>tx>>ty;
		if (sx==tx&&sy==ty) {
			cout<<0<<endl;
			continue;
		}
		S=++V;
		T=++V;
		if (Map[sx][sy]==0||Map[tx][ty]==0) {
			cout<<-1<<endl;
			continue;
		}
		Map[sx][sy]=0;
		for (int i=0;i<4;i++) {
			if (Map[sx+dir[i][0]][sy+dir[i][1]]) {
				int D=Bfs(ex,ey,sx+dir[i][0],sy+dir[i][1]);
				if (D<inf) {
					AddEdge(S,v[sx][sy][i],D);
				}
			}
		}
		Map[sx][sy]=1;
		for (int i=0;i<4;i++) {
			if (Map[tx+dir[i][0]][ty+dir[i][1]]) {
				AddEdge(v[tx][ty][i],T,0);
			}
		}
		cout<<spfa()<<endl;
	}
	return 0;
}

/**************************************************************
	Problem: 2329
	User: admin
	Language: C++
	Result: Accepted
	Time:400 ms
	Memory:2936 kb
****************************************************************/