华容道

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#define MaxN 35

using namespace std;

const int
INF=~0U>>2,
dx[]={0,0,-1,1},
dy[]={-1,1,0,0};
int mat[MaxN][MaxN],dis[MaxN][MaxN][4];
int step[MaxN][MaxN][4][4];
int d[MaxN][MaxN];
int n,m,q,test,ex,ey,sx,sy,tx,ty;

struct node{
int x,y;
};

struct node2{
int x,y,k;
};

bool inside(int x, int y){
return (x>=1&&x<=n&&y>=1&&y<=m);
}

int spfa(){
queue<node2> q;
while(!q.empty()) q.pop();
for(int k=0;k<4;k++)
if(dis[sx][sy][k]!=INF)
q.push((node2){sx,sy,k});
while(!q.empty()){
int x=q.front().x;
int y=q.front().y;
int k=q.front().k;
q.pop();
for(int i=0;i<4;i++){
int _x=x+dx[i];
int _y=y+dy[i];
if(inside(_x,_y))
if(mat[_x][_y])
if(step[x][y][k][i]!=INF)
if(dis[_x][_y][i^1]>dis[x][y][k]+step[x][y][k][i]+1) {
dis[_x][_y][i^1]=dis[x][y][k]+step[x][y][k][i]+1;
q.push((node2){_x,_y,i ^ 1 });
}
}
}
int ans=INF;
for(int i=0;i<4;i++)
if(dis[tx][ty][i]<ans)
ans=dis[tx][ty][i];
return (ans==INF)? -1:ans;
}

int bfs(int sx,int sy,int tx,int ty){
if(!mat[sx][sy])
return INF;
if(!mat[tx][ty])
return INF;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
d[i][j]=INF;
d[sx][sy]=0;
queue<node> q;
while(!q.empty()) q.pop();
q.push((node){sx,sy});
while(!q.empty()){
if(d[tx][ty]!=INF)
return d[tx][ty];
int x=q.front().x;
int y=q.front().y;
q.pop();
for(int i=0;i<4;i++){
int _x=x+dx[i];
int _y=y+dy[i];
if(inside(_x,_y))
if(mat[_x][_y]&&d[_x][_y]==INF){
d[_x][_y]=d[x][y]+1;
q.push((node){_x,_y});
}
}
}
return INF;
}

void init(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int v=mat[i][j];
mat[i][j]=0;
for (int k=0;k<4;k++)
for (int l=0;l<4;l++)
step[i][j][k][l]=bfs(i+dx[k],j+dy[k],i+dx[l],j+dy[l]);
mat[i][j]=v;
}
}

int getAns(){
scanf("%d%d%d%d%d%d",&ex,&ey,&sx,&sy,&tx,&ty);
if(sx==tx&&sy==ty)
return 0;
if(sx==ex&&sy==ey)
return -1;
if(!inside(ex,ey)||!inside(sx,sy)||!inside(tx,ty))
return -1;
if(!mat[ex][ey]||!mat[sx][sy]||!mat[tx][ty])
return -1;
for(int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
for (int k=0;k<4;k++)
dis[i][j][k]=INF;
mat[sx][sy]=0;
for(int k=0;k<4;k++)
dis[sx][sy][k]=bfs(ex,ey,sx+dx[k],sy+dy[k]);
mat[sx][sy]=1;
return spfa();
}

int main(){
freopen("puzzle.in","r",stdin);
freopen("puzzle.out","w",stdout);
scanf("%d%d%d",&n,&m,&test);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mat[i][j]);
init();
while(test--)
printf("%d\n",getAns());
return 0;
}

posted @ 2016-07-12 20:44  MAVERICK.FREDRICK  阅读(183)  评论(2编辑  收藏  举报