#include<bits/stdc++.h>
#define maxn 65
using namespace std;
const int K=(1<<16)-1;
int ex,ey,sx,sy,n,cnt;
struct node{
int x,y;
char typ;
}chess[20];
char mp[maxn][maxn];
int czr[maxn][maxn],ans[maxn][maxn];
int dx[]={ 1,-1, 1,-1, 2,-2, 2,-2};
int dy[]={-2,-2, 2, 2,-1,-1, 1, 1};
struct nd{
int x,y,s,move;
};
bool check(int nowx,int nowy,int nows){
int x=nowx,y=nowy,s=nows;
for(int i=1,j=1;i<=s&&j<=cnt;i<<=1,j++){
if(!(s&i))continue;
char op=chess[j].typ;
int xx=chess[j].x,yy=chess[j].y;
if(op=='X')if(abs(xx-x)<=1&&abs(yy-y)<=1)return 0;
else if(op=='P')if(x==xx+1&&abs(yy-y)==1)return 0;
else if(op=='K'){
for(int j=0;j<8;++j){
int xxx=xx+dx[j];
int yyy=yy+dy[j];
if(xxx==x&&yyy==y)return 0;
}
}
else if(op=='C'){
if(x==xx){
int kx=xx;int ky=yy;ky--;
while(ky>y){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
ky--;
}
if(ky==y)return 0;
ky=yy;ky++;
while(ky<y){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
ky++;
}
if(ky==y)return 0;
}
if(y==yy){
int ky=yy;int kx=xx;kx--;
while(kx>x){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
kx--;
}
if(kx==x)return 0;
kx=xx;kx++;
while(kx<x){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
kx++;
}
if(kx==x)return 0;
}
}
else if(op=='B'){
int kx=xx,ky=yy;
if(abs(xx-x)!=abs(yy-y))continue;
int dtx=(xx-x>0)?-1:1;kx+=dtx;
int dty=(yy-y>0)?-1:1;ky+=dty;
while((dtx==1?(x>kx):(x<kx))&&(dty==1?(y>ky):(y<ky))){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
kx+=dtx;ky+=dty;
}
if(kx==x&&ky==y)return 0;
}
else if(op=='Q'){
int kx=xx,ky=yy;
if(abs(xx-x)!=abs(yy-y))continue;
int dtx=(xx-x>0)?-1:1;kx+=dtx;
int dty=(yy-y>0)?-1:1;ky+=dty;
while((dtx==1?(x>kx):(x<kx))&&(dty==1?(y>ky):(y<ky))){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
kx+=dtx;ky+=dty;
}
if(kx==x&&ky==y)return 0;
if(x==xx){
ky=yy;ky--;
while(ky>y){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
ky--;
}
if(ky==y)return 0;
ky=yy;ky++;
while(ky<y){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
ky++;
}
if(ky==y)return 0;
}
if(y==yy){
int kx=xx;kx--;
while(kx>x){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
kx--;
}
if(kx==x)return 0;
kx=xx;kx++;
while(kx<x){
if(czr[kx][ky])if(!((1<<(czr[kx][ky]-1))&s))break;
kx++;
}
if(kx==x)return 0;
}
}
}
return 1;
}
void see(){
return;
cout<<"\n\n\n";
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j)cout<<(char)((ans[i][j]!=1e9)?ans[i][j]+'0':'N')<<' ';
cout<<'\n';
}
}
void init(){
memset(czr,0,sizeof czr);
cnt=0;
}
int work(){
init();
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
cin>>mp[i][j];
if(mp[i][j]=='O')sx=i,sy=j;
else chess[++cnt]=(node){i,j,mp[i][j]},czr[i][j]=cnt;
if(mp[i][j]=='X')ex=i,ey=j;
ans[i][j]=1e9;
}
}
queue<nd>q;q.push((nd){sx,sy,K,0});
while(q.size()){
nd now=q.front();q.pop();
int x=now.x;int y=now.y;int s=now.s;int mov=now.move;
ans[x][y]=min(ans[x][y],mov);
if(x==ex&&y==ey){
cout<<mov<<'\n';
see();
return 0;
}
for(int i=0;i<8;++i){
int tox=x+dx[i];
int toy=y+dy[i];
if(tox>0&&toy>0&&tox<=n&&toy<=n){
bool eat=0;
if(czr[tox][toy])if(!((1<<(czr[tox][toy]-1))&s))eat=1;
if(eat){
s-=(1<<(czr[tox][toy]-1));
if(check(tox,toy,s))q.push((nd){tox,toy,s,mov+1});
s+=(1<<(czr[tox][toy]-1));
}
else if(check(tox,toy,s))q.push((nd){tox,toy,s,mov+1});
}
}
}
cout<<-1<<'\n';
see();
return 0;
}
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
while(cin>>n){
work();
}
return 0;
}