#include<bits/stdc++.h>
using namespace std;
#define MAX 55
#define ll long long
ll n,X,Y,k,K,ans=INT_MAX;
char c[MAX][MAX];
ll a[MAX][MAX],l=INT_MAX,r;
bool f[MAX][MAX];
void dfs(int x,int y,int h,int z){
f[x][y]=1;
if(c[x][y]=='K')k++;
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
if(x+i<=n and x+i>=1 and y+j<=n and y+j>=1 and !f[x+i][y+j] and a[x+i][y+j]>=h and a[x+i][y+j]<=z){
dfs(x+i,y+j,h,z);
}
}
}
}
bool check(int mid,int z){
memset(f,0,sizeof(f));
k=0;
dfs(X,Y,mid,z);
if(k==K)return 1;
return 0;
}
int main(){
#ifdef DOWN
freopen("in","r",stdin);
freopen("out","w",stdout);
#else
ios::sync_with_stdio(0);
#endif
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>c[i][j];
if(c[i][j]=='P'){
X=i;Y=j;
}else if(c[i][j]=='K'){
K++;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(a[i][j]<a[X][Y])continue;
l=1;
r=a[i][j];
while(l<=r){
ll mid=(l+r+1)>>1;
bool flag=check(mid,a[i][j]);
if(flag){
ans=min(ans,a[i][j]-mid);
l=mid+1;
}else{
r=mid-1;
}
}
}
cout<<ans<<endl;
return 0;
}
wa记录