RT,只有五分
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define int long long
#define N 100005
using namespace std;
int xx[4]={1,0,-1,0};
int yy[4]={0,1,0,-1};
int rv[4]={3,4,1,2};
int n,m,q,mp[35][35],ljf,dis[N];
int stx,sty,eyx,eyy,edx,edy;
int id[35][35][4],dp[35][35][4][4];
bool v1[35][35],v2[N];
struct cxl{int x,y,d;}p[N];
queue<int> q1;
bool check(int x,int y){
if(x<1||x>n)return false;
if(y<1||y>m)return false;
if(mp[x][y]==0)return false;
return true;
}
int bfs1(int sx,int sy,int ex,int ey){
queue<cxl> q2;
q2.push((cxl){sx,sy,0});
while(!q2.empty()){
cxl f=q2.front();
q2.pop();
if(f.x==ex&&f.y==ey)return f.d;
for(int i=0;i<4;i++){
int lx=f.x+xx[i];
int ly=f.y+yy[i];
if(!check(lx,ly))continue;
if(v1[lx][ly])continue;
q2.push((cxl){lx,ly,f.d+1});
v1[lx][ly]=true;
}
}
return -1;
}
void bfs2(int sx,int sy,int ex,int ey){
queue<cxl> q2;
memset(v1,false,sizeof(v1));
q2.push((cxl){sx,sy,0});
v1[sx][sy]=v1[ex][ey]=true;
while(!q2.empty()){
cxl f=q2.front();
q2.pop();
for(int i=0;i<4;i++){
if(ex+xx[i]==f.x&&ey+yy[i]==f.y){
int lky=id[ex][ey][i];
q1.push(lky);
v2[lky]=true;
dis[lky]=f.d;
break;
}
}
for(int i=0;i<4;i++){
int lx=f.x+xx[i];
int ly=f.y+yy[i];
if(!check(lx,ly))continue;
if(v1[lx][ly])continue;
q2.push((cxl){lx,ly,f.d+1});
v1[lx][ly]=true;
}
}
return;
}
void spfa(int ex,int ey){
while(!q1.empty()){
int f=q1.front();
q1.pop();
v2[f]=0;
int x=p[f].x;
int y=p[f].y;
int d=p[f].d;
for(int i=0;i<4;i++){
int lx=x+xx[i];
int ly=y+yy[i];
if(check(lx,ly)){
int to=id[lx][ly][rv[i]];
if(dis[to]>dis[f]+dp[x][y][d][i]+1){
dis[to]=dis[f]+dp[x][y][d][i]+1;
if(!v2[to]){
q1.push(to);
v2[to]=true;
}
}
}
}
}
int ans=2147483647;
for(int i=0;i<4;i++)ans=min(ans,dis[id[ex][ey][i]]);
if(ans==2147483647)printf("-1\n");
else printf("%lld\n",ans);
return;
}
main(){
scanf("%lld%lld%lld",&n,&m,&q);
memset(dp,63,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%lld",&mp[i][j]);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!mp[i][j])continue;
for(int k=0;k<4;k++){
if(!check(i+xx[k],j+yy[k]))continue;
for(int l=0;l<4;l++){
if(!check(i+xx[l],j+yy[l]))continue;
memset(v1,false,sizeof(v1));
v1[i][j]=true;
int wff=bfs1(i+xx[k],j+yy[k],i+xx[l],j+yy[l]);
if(wff!=-1)dp[i][j][k][l]=wff;
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!mp[i][j])continue;
for(int k=0;k<4;k++){
ljf+=1;
id[i][j][k]=ljf;
p[ljf]=(cxl){i,j,k};
}
}
}
while(q--){
scanf("%lld%lld%lld%lld%lld%lld",&eyx,&eyy,&stx,&sty,&edx,&edy);
if(stx==edx&&sty==edy){
printf("0\n");
continue;
}
memset(dis,63,sizeof(dis));
memset(v2,false,sizeof(v2));
bfs2(eyx,eyy,stx,sty);
spfa(edx,edy);
}
return 0;
}