BFS 15分求助
查看原帖
BFS 15分求助
250699
mot1ve楼主2021/10/4 22:28

大体思路应该没问题,用一个四元组表示状态,向四个方向拓展,每次拓展时注意不能和上次拓展的方向相同也不能相反。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;
}
2021/10/4 22:28
加载中...