大体思路应该没问题,用一个四元组表示状态,向四个方向拓展,每次拓展时注意不能和上次拓展的方向相同也不能相反。4个dfs是预处理的这个点改变重力方向后会到哪个点。样例可过。
//BFS暴力转移,4^n,预处理出每个点会到哪里
#include<bits/stdc++.h>
using namespace std;
int n,m,T,a,b,c,d,ans;
int vis[260][260];
struct node{
int a1,b1,a2,b2,step,last;//last表示这个状态由哪个方向得到的
};
struct node1{
int x,y;
}up1[260][260],down1[260][260],left1[260][260],right1[260][260];
int dfs1(int x,int y)//上
{
while(1)
{
if((vis[x-1][y])||(x-1<1))
break;
x--;
}
return x;
}
int dfs2(int x,int y)//下
{
while(1)
{
if((vis[x+1][y])||(x+1>n))
break;
x++;
}
return x;
}
int dfs3(int x,int y)//左
{
while(1)
{
if((vis[x][y-1])||(y-1<1))
break;
y--;
}
return y;
}
int dfs4(int x,int y)//右
{
while(1)
{
if((vis[x][y+1])||(y+1>n))
break;
y++;
}
return y;
}
void bfs()//四元组作为状态BFS
{
queue<node> q;
q.push((node){a,b,c,d,0,-1});
while(!q.empty())
{
node now=q.front();//状态
int a1=now.a1;
int b1=now.b1;
int a2=now.a2;
int b2=now.b2;
int step=now.step;
int last=now.last;
q.pop();
if(a1==a2&&b1==b2)//结束
{
ans=now.step;
return ;
}
for(int i=1;i<=4;i++)//四向
{
if(i==last)
continue;
if(i==1&&last==2)
continue;
if(i==2&&last==1)
continue;
if(i==3&&last==4)
continue;
if(i==4&&last==3)
continue;
if(i==1)//上
{
int nxt1=up1[a1][b1].x;
int nxt2=up1[a1][b1].y;
int nxt3=up1[a2][b2].x;
int nxt4=up1[a2][b2].y;
q.push((node){nxt1,nxt2,nxt3,nxt4,step+1,1});
}
if(i==2)//下
{
int nxt1=down1[a1][b1].x;
int nxt2=down1[a1][b1].y;
int nxt3=down1[a2][b2].x;
int nxt4=down1[a2][b2].y;
q.push((node){nxt1,nxt2,nxt3,nxt4,step+1,2});
}
if(i==3)//左
{
int nxt1=left1[a1][b1].x;
int nxt2=left1[a1][b1].y;
int nxt3=left1[a2][b2].x;
int nxt4=left1[a2][b2].y;
q.push((node){nxt1,nxt2,nxt3,nxt4,step+1,3});
}
if(i==4)//右
{
int nxt1=right1[a1][b1].x;
int nxt2=right1[a1][b1].y;
int nxt3=right1[a2][b2].x;
int nxt4=right1[a2][b2].y;
q.push((node){nxt1,nxt2,nxt3,nxt4,step+1,4});
}
}
}
}
int main()
{
cin>>n>>m>>T;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
vis[x][y]=1;
}
for(int i=1;i<=n;i++)//预处理
{
for(int j=1;j<=n;j++)
{
if(vis[i][j])
continue;
up1[i][j]=(node1){dfs1(i,j),j};
down1[i][j]=(node1){dfs2(i,j),j};
left1[i][j]=(node1){i,dfs3(i,j)};
right1[i][j]=(node1){i,dfs4(i,j)};
}
}
while(T--)
{
scanf("%d%d%d%d",&a,&b,&c,&d);
bfs();
printf("%d\n",ans);
}
return 0;
}