#include<bits/stdc++.h>
using namespace std;
int n,m,r,x,len,y,ans=1e8,vis[300][300],sum,a[1000][1000],b[500][500];
int dx[10]={0,0,0,1,1,1,-1,-1,-1};
int dy[10]={0,1,-1,1,0,-1,1,0,-1};
char c;
map<int,int>q;
int p[2510];
void dfs(int x,int y,int l,int r){
if(x==0||y==0||x>n||y>n||vis[x][y]==1||a[x][y]<p[l]||a[x][y]>p[r]) return;
vis[x][y]=1;
if(b[x][y]==1) sum++;
for(int i=0;i<8;i++){
int x1=x+dx[i],y1=y+dy[i];
dfs(x1,y1,l,r);
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>c;
if(c=='P') x=i,y=j;
else if(c=='K'){
b[i][j]=1;
len++;
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(q[a[i][j]]==0){
p[++m]=a[i][j];
q[a[i][j]]=1;
}
}
sort(p+1,p+m+1);
r=1;
for(int l=1;l<=m;l++){
sum=0;
if(r<m){
while(r<=m&&sum!=len){
sum=0;
if(p[l]>a[x][y]){
cout<<ans;
return 0;
}
else if(p[r]<a[x][y]){
r++;
continue;
}
dfs(x,y,l,r);memset(vis,0,sizeof(vis));
if(sum==len){
ans=min(ans,p[r]-p[l]);
}
else r++;
}
}
else{
while(sum!=len){
sum=0;
if(p[l]>a[x][y]){
cout<<ans;
return 0;
}
dfs(x,y,l,r);memset(vis,0,sizeof(vis));
if(sum==len){
ans=min(ans,p[r]-p[l]);
}
else{
cout<<ans;
return 0;
}
}
}
}
cout<<ans;
return 0;
}