90分代码求调,悬关
查看原帖
90分代码求调,悬关
524966
ImNot6Dora楼主2023/2/12 12:58

90分代码求助dalao!!!!!在线等!!!

#include<bits/stdc++.h>
using namespace std;
bool vis[3001][3001];
bool fly[3001][3001];
int mapp[3001][3001];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
int q[9000001][3];
int n,m,k,ans,ans1,ans2;
int ex,ey,sx,sy;
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	return x*f;
}
inline void bfs(){
	int front=1,rear=1;
	q[rear][0]=1;
	q[rear][1]=1;
	q[rear][2]=0;
	rear++;
	vis[1][1]=1;
	while(front<rear){
		if(q[front][0]==n&&q[front][1]==m){
			ans=q[front][2];
			return;
		}
		for(int i=0;i<4;i++){
			int nx=dx[i]+q[front][0];
			int ny=dy[i]+q[front][1];
			if(nx>0&&nx<=n&&ny>0&&ny<=m&&!vis[nx][ny]&&mapp[nx][ny]){
				q[rear][0]=nx;
				q[rear][1]=ny;
				q[rear][2]=q[front][2]+1;
				vis[nx][ny]=1;
				rear++;
			}
		}
		front++;
	}
	ans=-1;
}
inline void front_bfs(){
	int front=1,rear=1;
	q[rear][0]=1;
	q[rear][1]=1;
	q[rear][2]=0;
	rear++;
	vis[1][1]=1;
	while(front<rear){
		if(fly[q[front][0]][q[front][1]]){
	//		cout<<q[front][2]<<endl;
			sx=q[front][0];
			sy=q[front][1];
			ans2=q[front][2];
			return;
		}
		for(int i=0;i<4;i++){
			int nx=dx[i]+q[front][0];
			int ny=dy[i]+q[front][1];
			if(nx>0&&nx<=n&&ny>0&&ny<=m&&!vis[nx][ny]&&mapp[nx][ny]){
				q[rear][0]=nx;
				q[rear][1]=ny;
				q[rear][2]=q[front][2]+1;
				vis[nx][ny]=1;
				rear++;
			}
		}
		front++;
	}
	ans2=-1;
} 
inline void rear_bfs(){
	int front=1,rear=1;
	q[rear][0]=n;
	q[rear][1]=m;
	q[rear][2]=0;
	rear++;
	vis[n][m]=1;
	while(front<rear){
		if(fly[q[front][0]][q[front][1]]){
		//	cout<<q[front][2]<<endl;
			ex=q[front][0];
			ey=q[front][1];
			ans1=q[front][2];
			return;
		}
		for(int i=0;i<4;i++){
			int nx=dx[i]+q[front][0];
			int ny=dy[i]+q[front][1];
			if(nx>0&&nx<=n&&ny>0&&ny<=m&&!vis[nx][ny]&&mapp[nx][ny]){
				q[rear][0]=nx;
				q[rear][1]=ny;
				q[rear][2]=q[front][2]+1;
				vis[nx][ny]=1;
				rear++;
			}
		}
		front++;
	}
	ans1=-1;
}
int main(){
	n=read(),m=read(),k=read();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			mapp[i][j]=read();
		}
	}
	if(k==0){
		bfs();
		cout<<ans;
	}else{
		for(int i=1;i<=k;i++)fly[read()][read()]=1;	
		front_bfs();
		memset(vis,0,sizeof(vis));
		memset(q,0,sizeof(q));
		rear_bfs();
	//	cout<<ans1<<' '<<ans2<<endl;
		if(ex==sx&&ey==sy){
			cout<<ans1+ans2-1;
			return 0;
		}
	//	cout<<sx<<' '<<sy<<' '<<ex<<' '<<ey<<'\n';
		if(mapp[sx][sy]==mapp[ex][ey])ans1=ans1+ans2+1;
		else ans1=ans1+ans2+2;
		memset(vis,0,sizeof(vis));
		memset(q,0,sizeof(q));
		bfs();
		if(ans==-1)cout<<ans1;
		else cout<<min(ans,ans1);
	}
	return 0;
}
2023/2/12 12:58
加载中...