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;
}