P1979 华容道求助
  • 板块学术版
  • 楼主L2007
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/10/13 15:04
  • 上次更新2023/11/4 03:55:25
查看原帖
P1979 华容道求助
244362
L2007楼主2021/10/13 15:04

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;
}
2021/10/13 15:04
加载中...