#include<bits/stdc++.h>
using namespace std;
const int N=3e3+100;
int n,m,k,mp[N][N],nex[10],ney[10];
bool vis[N][N],a[N][N],b[N][N];
const int M=1e6+100,inf=1e9;
int mia_dis=inf,mib_dis=inf;
bool h[M];
void deal(){
nex[1]=1,nex[2]=0,nex[3]=-1,nex[4]=0;
ney[1]=0,ney[2]=1,ney[3]=0,ney[4]=-1;
}
int disa[N][N],disb[N][N];
struct node{int x,y,dis;};
queue<node>q;
void bbfs(int x,int y,int fl){
cout<<'s';
if(fl==1) q.push((node){1,1,0});
else q.push((node){n,m,0});
bool no[N][N];memset(no,0,sizeof(no));
while(!q.empty()){
node u=q.front();q.pop();
no[u.x][u.y]=1;
if(fl==1){
if(vis[x][y]) a[x][y]=1,mia_dis=min(mia_dis,disa[x][y]);
}
else{
if(vis[x][y]) b[x][y]=1,mib_dis=min(mib_dis,disb[x][y]);
}
for(int i=1;i<=4;i++){
int dx=x+nex[i],dy=y+ney[i];
if(dx>n||dy>m||dx<0||dy<0||mp[dx][dy]==0||no[dx][dy]) continue;
if(fl==1){
disa[dx][dy]=u.dis+1;
if(!no[dx][dy]) q.push((node){dx,dy,disa[dx][dy]});
}
if(fl==1){
disb[dx][dy]=u.dis+1;
if(!no[dx][dy]) q.push((node){dx,dy,disb[dx][dy]});
}
}
}
}
int main(){
int turn=1;
cin>>n>>m>>k;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>mp[i][j];
for(int i=1,x,y;i<=k;i++){cin>>x>>y;vis[x][y]=1;}
bbfs(1,1,1);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(a[i][j] and disa[i][j]==mia_dis) h[mp[i][j]]=1;
bbfs(n,m,2);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(b[i][j] and disb[i][j]==mib_dis) if(h[mp[i][j]]) turn=0;
int ans;
if(a[n][m]) ans=min(disa[n][m],mia_dis+mib_dis+turn);
else ans=mia_dis+mib_dis+turn;
cout<<ans;
}