40分,真【】的开心,而且最后交一发才5分
#include<bits/stdc++.h>
using namespace std;
int n,m,k,a[3005][3005],c[3005][3005],b[3005][3005],fx[4]={1,-1,0,0},fy[4]={0,0,-1,1},x,y;
struct node{
int x,y,k;
};
queue<node>s;
void check(int x,int y,int kk){
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!b[i][j]||c[i][j])continue;
if((x==i&&y==j)||(i==x-1&&j==y)||(i==x&&j==y-1)||(i==x+1&&j==y)||(i==x&&j==y+1))continue;
if(a[i][j]==0)continue;
else if(a[i][j]==a[x][y])s.push((node){i,j,kk+1});
else s.push((node){i,j,kk+2});
c[i][j]=1;
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
for(int i=1;i<=k;i++){
scanf("%d%d",&x,&y);
b[x][y]=1;
}
s.push((node){1,1,0});
c[1][1]=1;
if(b[1][1]==1)check(1,1,0);
while(!s.empty()){
node f=s.front();
if(f.x==n&&f.y==m){
cout<<f.k;
return 0;
}
for(int i=0;i<=3;i++){
int ax=f.x+fx[i];
int ay=f.y+fy[i];
if(c[ax][ay])continue;
if(a[ax][ay]==0)continue;
if(ax<1||ax>n||ay<1||ay>m)continue;
if(b[ax][ay])check(ax,ay,f.k);
s.push((node){ax,ay,f.k+1});
c[ax][ay]=1;
}
//cout<<f.x<<" "<<f.y<<" "<<f.k<<endl;
s.pop();
}
cout<<-1;
return 0;
}