样例全过,hack全过,40分求助
查看原帖
样例全过,hack全过,40分求助
616964
Adolfo_North楼主2023/3/5 15:32
#include<bits/stdc++.h>
using namespace std;
int x3[4]={-1,0,0,1},y3[4]={0,-1,1,0};
int n,m,k,ans=0x7fffffff;
//bool f[3001][3001];
int a[3001][3001];
int sum1[3001][3001];
int sum2[3001][3001];
struct node{
	int qx,qy;
}s[6001];
void bfs(int q1,int q2,int w1,int w2){
	int had=1,nxt=1;
	s[1].qx=q1;s[1].qy=q2;
	while(had<=nxt){
		for(int i=0;i<=3;i++){
			int px=s[had].qx+x3[i];
			int py=s[had].qy+y3[i];
			if(px==q1&&py==q2) continue; 
			if(a[px][py]==0||px<=0||px>n||py>m||py<=0||sum1[px][py]>0) continue;
//			cout<<px<<' '<<py<<endl;
			s[++nxt].qx=px;s[nxt].qy=py;
			sum1[px][py]=sum1[s[had].qx][s[had].qy]+1;
			if(px==n&&py==m) ans=sum1[px][py];
		}
		had++;
	}
}
void bfs2(int q1,int q2,int w1,int w2){
	int had=1,nxt=1;
	s[1].qx=q1;s[1].qy=q2;
	while(had<=nxt){
		for(int i=0;i<=3;i++){
			int px=s[had].qx+x3[i];
			int py=s[had].qy+y3[i];
			if(px==q1&&py==q2) continue; 
			if(a[px][py]==0||px<=0||px>n||py>m||py<=0||sum2[px][py]>0) continue;
			s[++nxt].qx=px;s[nxt].qy=py;
			sum2[px][py]=sum2[s[had].qx][s[had].qy]+1;
		}
		had++;
	}
}
struct n{
	int sum=1e9,a1,x4,y4;
} fff[6001];
struct n2{
	int sum=1e9,a1,x5,y5;
} ff[6001];
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	bfs(1,1,n,m);
	memset(s,0,sizeof s);
	bfs2(n,m,1,1);
	int xx,yy,nf=0,mf=0;
//	cout<<sum1[4][1];
	for(int i=1;i<=k;i++){
		cin>>xx>>yy;
		if(xx==1&&yy==1) {
			nf=1;
			fff[1].a1=a[1][1];
			fff[1].sum=0;
			fff[1].x4=1;
			fff[1].y4=1;
			continue;
		}
		if(xx==n&&yy==m) {
			mf=1;
			ff[1].a1=a[n][m];
			ff[1].sum=0;
			ff[1].x5=n;
			ff[1].y5=m;
			continue;
		}
		if(sum1[xx][yy]>0&&sum2[xx][yy]==0){
//			cout<<1<<xx<<' '<<yy<<endl;
			if(sum1[xx][yy]>fff[nf].sum) continue;
			if(sum1[xx][yy]<fff[nf].sum) nf=0;
			fff[++nf].sum=sum1[xx][yy];
			fff[nf].a1=a[xx][yy];
			fff[nf].x4=xx;
			fff[nf].y4=yy;
		}
		else if(sum1[xx][yy]==0&&sum2[xx][yy]>0) {
//			cout<<2<<xx<<' '<<yy<<endl;
			if(sum2[xx][yy]>ff[mf].sum) continue;
			if(sum2[xx][yy]<ff[mf].sum) mf=0;
			ff[++mf].sum=sum2[xx][yy];
			ff[mf].a1=a[xx][yy];
			ff[mf].x5=xx;
			ff[mf].y5=yy;
		}
		else {
//			cout<<3<<xx<<' '<<yy<<endl;
			if(sum1[xx][yy]<=fff[nf].sum) {
				if(sum1[xx][yy]<fff[nf].sum) nf=0;
				fff[++nf].sum=sum1[xx][yy];
				fff[nf].a1=a[xx][yy];
				fff[nf].x4=xx;
				fff[nf].y4=yy;
			}
			if(sum2[xx][yy]<=ff[mf].sum){
				if(sum2[xx][yy]<ff[mf].sum) mf=0;
				ff[++mf].sum=sum2[xx][yy];
				ff[mf].a1=a[xx][yy];
				ff[mf].x5=xx;
				ff[mf].y5=yy;
			}
		}
//		cout<<fff[1].x4<<' '<<fff[1].y4<<' '<<ff[1].x5<<' '<<ff[1].y5<<endl;
	}
//	for(int i=1;i<=nf;i++) cout<<fff[i].x4<<' '<<fff[i].y4;
//	for(int i=1;i<=mf;i++) cout<<ff[i].x5<<' '<<ff[i].y5;
	for(int i=1;i<=nf;i++){
		for(int j=1;j<=mf;j++){
			if(fff[i].x4==ff[j].x5&&fff[i].y4==ff[j].y5) continue;
			if(fff[i].a1==ff[j].a1) ans=min(ans,fff[i].sum+ff[j].sum+1);
			else ans=min(ans,fff[i].sum+ff[j].sum+2);
//			cout<<fff[i].x4<<' '<<fff[i].y4<<' '<<ff[j].x5<<' '<<ff[j].y5<<ans<<endl;
		}
	}
	if(ans==0x7fffffff) cout<<-1;
	else cout<<ans;
	return 0;
}
2023/3/5 15:32
加载中...