不知道其他有没有错,但是这样写的人不少罢,可能是我哪里傻了,遂求调。
//Author: Velvet on Luogu(uid=443675)
#include <bits/stdc++.h>
#define mkpr make_pair
#define fi first
#define se second
#define F(i,a,b) for(int i=(a);i<=(b);i++)
#define dF(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
using namespace __gnu_cxx;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
inline void writeln(int x){write(x);putchar('\n');}
inline void writesp(int x){write(x);putchar(' ');}
inline int lowbit(int x) {return x&(-x);}
typedef pair<int,int> Pair;
const int N=3005,dx[]={0,0,0,1,-1},dy[]={0,1,-1,0,0};
int n,m,k,h[N][N],vis[N][N],c[N][N],usd=1;
bool check(int x,int y){
return x>=1&&x<=n&&y>=1&&y<=m&&h[x][y]!=0;
}
struct node{int x,y,s;};
queue<node> Q;
void bfs(){
Q.push({1,1,0});
while(Q.size()){
int x=Q.front().x,y=Q.front().y,s=Q.front().s;
Q.pop();if(x==n&&y==m){
cout<<s;exit(0);
}vis[x][y]=1;
F(i,1,4){
int nx=x+dx[i],ny=y+dy[i];
if(check(nx,ny)&&!vis[nx][ny])
Q.push({nx,ny,s+1});
}
if(c[x][y]&&usd){
F(i,1,n) F(j,1,m){
if(!c[i][j]||i==x&&j==y) continue ;
if(check(i,j)&&!vis[i][j])
Q.push({i,j,s+1+(h[i][j]!=h[x][y])});
}usd=0;
}
}
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
F(i,1,n) F(j,1,m) cin>>h[i][j];
F(i,1,k){
int x,y;cin>>x>>y;
c[x][y]=1;
}
bfs();cout<<(-1);
return 0;
}