洛谷数据下载非常有素质,但是
查看原帖
洛谷数据下载非常有素质,但是
720455
Rain_Carnation楼主2023/2/14 20:03

WA #18 20 数据太大无法下载

#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int n,m,k,h[3010][3010],d1[3010][3010],d2[3010][3010];
bool fly[3010][3010],vis[3010][3010],flag[3010];
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
queue<pair<int,int> >q;
int bfs1(){
	q.push(make_pair(1,1)); d1[1][1]=0;
	int res=1e9;
	while(!q.empty()){
		int x=q.front().first,y=q.front().second; q.pop();
		if(vis[x][y]) continue; vis[x][y]=1;
		if(fly[x][y]) res=min(res,d1[x][y]);
		for(int i=0;i<4;++i){
			int x1=x+dx[i],y1=y+dy[i];
			if(x1<1 || y1<1 || x1>n || y1>m || !h[x1][y1] || vis[x1][y1]) continue;
			d1[x1][y1]=d1[x][y]+1;
			q.push(make_pair(x1,y1));
		}
	}
//	cout<<d1[1][1]<<endl;
	return res;
}
int bfs2(){
	q.push(make_pair(n,m)); d2[n][m]=0;
	int res=1e9;
	while(!q.empty()){
		int x=q.front().first,y=q.front().second; q.pop();
		if(vis[x][y]) continue; vis[x][y]=1;
		if(fly[x][y]) res=min(res,d2[x][y]);
		for(int i=0;i<4;++i){
			int x1=x+dx[i],y1=y+dy[i];
			if(x1<1 || y1<1 || x1>n || y1>m || !h[x1][y1] || vis[x1][y1]) continue;
			d2[x1][y1]=d2[x][y]+1;
			q.push(make_pair(x1,y1));
		}
	}
	return res;
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j) scanf("%d",&h[i][j]);
	for(int i=1;i<=k;++i){
		int x,y; scanf("%d%d",&x,&y);
		fly[x][y]=1;
	}
	memset(d1,0x3f,sizeof d1);
	int dis1=bfs1();
	memset(d2,0x3f,sizeof d2); memset(vis,0,sizeof vis);
	int dis2=bfs2(); 
//	cout<<dis2<<endl;
//	for(int i=1;i<=n;++i,printf("\n"))
//		for(int j=1;j<=m;++j) cout<<d2[i][j]<<' ';
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(d1[i][j]==dis1 && fly[i][j]) flag[h[i][j]]=1;
	int ans=d1[n][m];
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			if(d2[i][j]==dis2 && fly[i][j])
				if(flag[h[i][j]]) ans=min(ans,dis1+dis2+1);
				else ans=min(ans,dis1+dis2+2);
	if(ans>=1e9) cout<<-1;
	else if(k<=1) cout<<d1[n][m];
	else cout<<ans;
	return 0;
}
 

通过反馈结果看似乎都是比答案小了 1

2023/2/14 20:03
加载中...