program ss; const dx:array[1..4]of -1..1=(0,1,-1,0); dy:array[1..4]of -1..1=(1,0,0,-1); type edgenode=^edge; edge=record dir,w:longint; next:edgenode; end; var v1,map:array[0..31,0..31]of boolean; a:array[1..30,1..30,1..4]of edgenode; d1:array[1..30,1..30]of longint; d2:array[1..30,1..30,1..4]of longint; q1:array[1..10000,1..2]of integer; q2:array[1..100000,1..3]of longint; v2:array[1..30,1..30,1..4]of boolean; ans,f,r,ex,ey,sx,sy,tx,ty,n,m,q,i,j,k,l:longint; c:edgenode; procedure bfs(s1,s2,t1,t2:integer); var r,f,i,p,q:longint; begin fillchar(d1,sizeof(d1),255); fillchar(v1,sizeof(v1),0); fillchar(q1,sizeof(q1),0); f:=0; r:=1; q1[1,1]:=s1; q1[1,2]:=s2; d1[s1,s2]:=0; v1[s1,s2]:=true; while f<r do begin inc(f); p:=q1[f,1]; q:=q1[f,2]; for i:=1 to 4 do if (map[p+dx[i],q+dy[i]])and(d1[p+dx[i],q+dy[i]]=-1) then begin d1[p+dx[i],q+dy[i]]:=d1[p,q]+1; if (p+dx[i]=t1)and(q+dy[i]=t2) then exit; if not v1[p+dx[i],q+dy[i]] then begin inc(r); q1[r,1]:=p+dx[i]; q1[r,2]:=q+dy[i]; v1[p+dx[i],q+dy[i]]:=true; end; end; v1[p,q]:=false; end; end; begin readln(n,m,q); for i:=1 to n do for j:=1 to m do begin read(k); if k=1 then map[i,j]:=true; end; for i:=1 to n do for j:=1 to m do if map[i,j] then for k:=1 to 4 do if map[i+dx[k],j+dy[k]] then begin map[i,j]:=false; for l:=1 to 4 do if (k<>l)and(map[i+dx[l],j+dy[l]]) then begin bfs(i+dx[k],j+dy[k],i+dx[l],j+dy[l]); if d1[i+dx[l],j+dy[l]]<>-1 then begin new(c); c^.dir:=l; c^.w:=d1[i+dx[l],j+dy[l]]; c^.next:=a[i,j,k]; a[i,j,k]:=c; end; end; map[i,j]:=true; end; for i:=1 to q do begin fillchar(q2,sizeof(q2),0); fillchar(d2,sizeof(d2),255); fillchar(v2,sizeof(v2),0); f:=0; r:=0; readln(ex,ey,sx,sy,tx,ty); if ((ex=sx)and(ey=sy))or((ex=0)or(ey=0)) then begin writeln(-1); continue; end; if(sx=tx)and(sy=ty) then begin writeln(0); continue; end; map[sx,sy]:=false; for j:=1 to 4 do if map[sx+dx[j],sy+dy[j]] then begin bfs(ex,ey,sx+dx[j],sy+dy[j]); if d1[sx+dx[j],sy+dy[j]]<>-1 then begin inc(r); q2[r,1]:=sx; q2[r,2]:=sy; q2[r,3]:=j; d2[sx,sy,j]:=d1[sx+dx[j],sy+dy[j]]; v2[sx,sy,j]:=true; end; end; map[sx,sy]:=true; while f<r do begin inc(f); c:=a[q2[f,1],q2[f,2],q2[f,3]]; while c<>nil do begin if (d2[q2[f,1],q2[f,2],c^.dir]=-1) or(d2[q2[f,1],q2[f,2],c^.dir]>d2[q2[f,1],q2[f,2],q2[f,3]]+c^.w) then begin d2[q2[f,1],q2[f,2],c^.dir]:=d2[q2[f,1],q2[f,2],q2[f,3]]+c^.w; if not v2[q2[f,1],q2[f,2],c^.dir] then begin inc(r); q2[r,1]:=q2[f,1]; q2[r,2]:=q2[f,2]; q2[r,3]:=c^.dir; v2[q2[f,1],q2[f,2],c^.dir]:=true; end; end; c:=c^.next; end; if (d2[q2[f,1]+dx[q2[f,3]],q2[f,2]+dy[q2[f,3]],5-q2[f,3]]=-1) or(d2[q2[f,1]+dx[q2[f,3]],q2[f,2]+dy[q2[f,3]],5-q2[f,3]]>d2[q2[f,1],q2[f,2],q2[f,3]]+1) then begin d2[q2[f,1]+dx[q2[f,3]],q2[f,2]+dy[q2[f,3]],5-q2[f,3]]:=d2[q2[f,1],q2[f,2],q2[f,3]]+1; if not v2[q2[f,1]+dx[q2[f,3]],q2[f,2]+dy[q2[f,3]],5-q2[f,3]] then begin inc(r); q2[r,1]:=q2[f,1]+dx[q2[f,3]]; q2[r,2]:=q2[f,2]+dy[q2[f,3]];q2[r,3]:=5-q2[f,3]; v2[q2[f,1]+dx[q2[f,3]],q2[f,2]+dy[q2[f,3]],5-q2[f,3]]:=true; end; end; v2[q2[f,1],q2[f,2],q2[f,3]]:=false; end; ans:=maxlongint; for j:=1 to 4 do if (d2[tx,ty,j]<>-1)and(d2[tx,ty,j]<ans) then ans:=d2[tx,ty,j]; if ans=maxlongint then writeln(-1) else writeln(ans); end; end. /************************************************************** Problem: 2329 User: admin Language: Pascal Result: Wrong Answer ****************************************************************/