35分求调
查看原帖
35分求调
489890
SFlyer楼主2024/6/8 21:48
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int N = 33;
const int dx[] = {0,0,-1,1};
const int dy[] = {1,-1,0,0};

// right left up down

int n,m,q,a[N][N];
int dis[N][N];
vector<pair<int,int> > g[N*N*4];

int val(int x,int y){
	return 1<=x && x<=n && 1<=y && y<=m && a[x][y]==1;
}

int nwd(int d){
	if (d==0 || d==1){
		return 1-d;
	}
	return 5-d;
}

void bfs(int i,int j,int xx,int yy){
	a[xx][yy]=0;
	memset(dis,-1,sizeof dis);
	queue<pair<int,int> > q;
	q.push({i,j});
	dis[i][j]=0;
	while (!q.empty()){
		int x=q.front().first,y=q.front().second;
		q.pop();
		for (int d=0; d<4; d++){
			int nx=x+dx[d],ny=y+dy[d];
			if (val(nx,ny) && dis[nx][ny]==-1){
				dis[nx][ny]=dis[x][y]+1;
				q.push({nx,ny});
			}
		}
	}
	a[xx][yy]=1;
}

int id(int x,int y){
	return (x-1)*m+y;
}

int enc(int x,int y,int d){
	return 4*id(x,y)+d;
}

void add_edge(){
	for (int i=1; i<=n; i++){
		for (int j=1; j<=m; j++){
			if (!val(i,j)){
				continue;
			}
			for (int d=0; d<4; d++){
				int kx=i+dx[d],ky=j+dy[d];
				if (!val(kx,ky)){
					continue;
				}
				bfs(kx,ky,i,j);
				for (int nd=0; nd<4; nd++){
					int nkx=i+dx[nd],nky=j+dy[nd];
					if (val(nkx,nky) && dis[nkx][nky]>=1){
					//	cout<<enc(i,j,d)<<"->"<<enc(i,j,nd)<<endl;
						g[enc(i,j,d)].push_back({enc(i,j,nd),dis[nkx][nky]});
					}
				}
			}
		}
	}
	for (int i=1; i<=n; i++){
		for (int j=1; j<=m; j++){
			if (!val(i,j)){
				continue;
			}
			for (int d=0; d<4; d++){
				int ni=i+dx[d],nj=j+dy[d],nd=nwd(d);
				if (val(ni,nj)){
					g[enc(i,j,d)].push_back({enc(ni,nj,nd),1});
				}
			}
		}
	}
}

int d[N*N*4];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);

	cin>>n>>m>>q;
	for (int i=1; i<=n; i++){
		for (int j=1; j<=m; j++){
			cin>>a[i][j];
		}
	}
	add_edge();
	while (q--){
		int ex,ey,sx,sy,tx,ty;
		cin>>ex>>ey>>sx>>sy>>tx>>ty;
		if (sx==tx && sy==ty){
			cout<<0<<"\n";
			continue;
		}
		bfs(ex,ey,sx,sy);
		memset(d,-1,sizeof d);
		vector<pair<int,int> > v;
		for (int i=0; i<4; i++){
			if (val(sx+dx[i],sy+dy[i])){
				int di;
			//	cout<<sx<<","<<sy<<","<<i<<endl;
				d[enc(sx,sy,i)]=(di=dis[sx+dx[i]][sy+dy[i]]);
				if (~di) v.push_back({di,enc(sx,sy,i)});
			}
		}
		sort(v.begin(),v.end());
		priority_queue<pair<int,int> > q;
		for (auto u : v){
		//	cout<<u.second<<" pushed"<<endl;
			q.push({-u.first,u.second});
		}
		while (!q.empty()){
			auto x=q.top().second,di=-q.top().first;
		//	cout<<x<<" visited"<<","<<d[x]<<","<<di<<endl;
			q.pop();
			if (d[x]!=di){
				continue;
			}
			for (auto p : g[x]){
				int y=p.first,w=p.second;
				if (d[y]==-1){
					d[y]=d[x]+w;
					q.push({-d[y],y});
				}
			}
		}
		int ans=2e9;
		for (int i=0; i<4; i++){
		//	cout<<enc(tx,ty,i)<<endl;
			if (val(tx+dx[i],ey+dy[i]) && d[enc(tx,ty,i)]!=-1){
				ans=min(ans,d[enc(tx,ty,i)]);
			}
		}
		if (ans==2e9){
			ans=-1;
		}
		cout<<ans<<"\n";
	}
	return 0;
}
2024/6/8 21:48
加载中...