hahaha
BFS+SPFA.
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#defineMAXN 35#defineMAXV 100500#defineMaxe 400500#defineINF 100000007using namespacestd;structedge{intV,W,NXT;} E[maxe];intn,m,qq,map[maxn][maxn],dp[maxn][maxn][4],step[maxn][maxn][4][4],tot=0, nume=0, g[maxv],v[maxn][maxn][4];intdt[maxn][maxn],dx[]={-1,1,0,0},dy[]={0,0,-1,1},DIS[MAXV];intex,ey,sx,sy,tx,ty,s,t;BOOLVis[maxv];queue<int>Q;voidAddedge (intUintVintW) {e[++nume].v=v; E[NUME].W=W; E[NUME].NXT=G[u]; G[u]=Nume;}voidReset1 () { for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) for(intk=0; k<=3; k++) for(intL=0; l<=3; l++) Step[i][j][k][l]=inf;}voidReset2 () { for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) Dt[i][j]=inf;}voidReset3 () {Fill (Dis+1, dis+tot+1, INF); memset (Vis,false,sizeof(Vis));}BOOLJudgeintXinty) { if((x>=1) && (x<=n) && (y>=1) && (y<=m) &&(Map[x][y]))return true; return false;}intBFsintBxintByintTxintty) { while(!q.empty ()) Q.pop (); Reset2 (); Q.push (BX); Q.push (by); Dt[bx][by]=0; while(!Q.empty ()) { inthx=Q.front (); Q.pop (); inthy=Q.front (); Q.pop (); if((HX==TX) && (hy==ty))returnDt[tx][ty]; for(intI=0; i<=3; i++) { intrx=hx+dx[i],ry=hy+Dy[i]; if(Judge (Rx,ry) && (dt[rx][ry]>dt[hx][hy]+1)) {Dt[rx][ry]=dt[hx][hy]+1; Q.push (RX); Q.push (ry); } } } returninf;}voidPre_bfs () {Reset1 (); for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) { if(Map[i][j]) {Map[i][j]=0; for(intk=0; k<=3; k++) for(intL=0; l<=3; l++) { intAx,ay,bx,by; Ax=i+dx[k];ay=j+Dy[k]; BX=i+dx[l];by=j+Dy[l]; if(Judge (Ax,ay) &&judge (Bx,by)) { intR=BFS (Ax,ay,bx,by); if(r!=inf) step[i][j][k][l]=0; }} Map[i][j]=1; } }}voidPre_build () { for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) { if(judge (I,j)) { for(intk=0; k<=3; k++) for(intL=0; l<=3; l++) { intAx,ay,bx,by; Ax=i+dx[k];ay=j+Dy[k]; BX=i+dx[l];by=j+Dy[l]; if(Judge (Ax,ay) && (judge (Bx,by)) && (step[i][j][k][l]!=inf)) Addedge (V[i][j][k],v[bx][by][l^1],step[i][j][k][l]+1); } } }}voidbuild () {s=++tot;t=++tot; for(intI=0; i<=3; i++) { if(Judge (sx+dx[i],sy+Dy[i])) {Map[sx][sy]=0; intR=BFS (ex,ey,sx+dx[i],sy+Dy[i]); Map[sx][sy]=1; if(r!=inf) Addedge (S,V[SX][SY][I],R); } if(Judge (tx+dx[i],ty+Dy[i])) Addedge (V[tx][ty][i],t,0); } Map[sx][sy]=1;}intSPFA () {if((SX==TX) && (sy==ty))return 0; if((Sx==ex) && (Sy==ey))return-1; if((map[sx][sy]==0) || (map[tx][ty]==0))return-1; Build (); Reset3 (); while(!q.empty ()) Q.pop (); Q.push (s);d Is[s]=0; vis[s]=true; while(!Q.empty ()) { intHead=Q.front (); Q.pop (); for(intI=g[head];i;i=e[i].nxt) { intv=e[i].v; if(dis[v]>dis[head]+E[I].W) {Dis[v]=dis[head]+E[I].W; if(!Vis[v]) {Vis[v]=true; Q.push (v); }}} Vis[head]=false; } if(Dis[t]==inf)return-1; Else returndis[t];}intMain () {memset (g,0,sizeof(g)); scanf ("%d%d%d",&n,&m,&QQ); for(intI=1; i<=n;i++) for(intj=1; j<=m;j++) {scanf ("%d",&Map[i][j]); for(intk=0; k<=3; k++) V[i][j][k]=++tot; } PRE_BFS (); Pre_build (); for(intI=1; i<=qq;i++) {scanf ("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty); printf ("%d\n", SPFA ()); } return 0;}
Codevs 3290 Huarong Road