测试信息:https://www.luogu.com.cn/record/119622106
#include<bits/stdc++.h>
using namespace std;
char a[60][60];
bool st[60][60];
int emy[60][60];
int q[3600][3],h=0,t=-1,n,stx,sty,qe[3600][60][60];
int dy[8]={-1,1,2,2,1,-1,-2,-2};
int dx[8]={-2,-2,-1,1,2,2,1,-1};
void C(int x,int y,bool lod)
{
if(lod)
{
for(int i=y-1;i>0;i--)
{
emy[x][i]++;
if(a[x][i]!='.')
break;
}
for(int i=y+1;i<=n;i++)
{
emy[x][i]++;
if(a[x][i]!='.')
break;
}
for(int i=x-1;i>0;i--)
{
emy[i][y]++;
if(a[i][y]!='.')
break;
}
for(int i=x+1;i<=n;i++)
{
emy[i][y]++;
if(a[i][y]!='.')
break;
}
}
}
void K(int x,int y,bool lod)
{
if(lod)
{
for(int i=0;i<8;i++)
{
int xx=x+dx[i],yy=y+dy[i];
if(xx<1||xx>n||yy<1||yy>n)
continue;
emy[xx][yy]++;
}
}
}
void B(int x,int y,bool lod)
{
if(lod)
{
int j=y-1;
for(int i=x-1;i>0&&j>0;i--)
{
emy[i][j]++;
if(a[i][j]!='.')
break;
j--;
}
j=y-1;
for(int i=x+1;i<=n&&j>0;i++)
{
emy[i][j]++;
if(a[i][j]!='.')
break;
j--;
}
j=y+1;
for(int i=x-1;i>0&&j<=n;i--)
{
emy[i][j]++;
if(a[i][j]!='.')
break;
j++;
}
j=y+1;
for(int i=x+1;i<=n&&j<=n;i++)
{
emy[i][j]++;
if(a[i][j]!='.')
break;
j++;
}
}
}
void X(int x,int y)
{
int kx[8]={-1,0,1,1,1,0,-1,-1};
int ky[8]={-1,-1,-1,0,1,1,1,0};
for(int i=0;i<8;i++)
{
int xx=x+kx[i],yy=y+ky[i];
if(xx<1||xx>n||yy<1||yy>n)
continue;
emy[xx][yy]++;
}
}
int bfs(int fx,int fy)
{
q[0][0]=fx;
q[0][1]=fy;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
qe[0][i][j]=emy[i][j];
}
q[++t][2]=0;
st[fx][fy]=true;
while(h<=t)
{
int x=q[h][0],y=q[h][1],s=q[h][2],nowem[60][60];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
nowem[i][j]=qe[h][i][j];
}
for(int k=0;k<8;k++)
{
int xx=x+dx[k],yy=y+dy[k],nm[60][60];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
nm[i][j]=nowem[i][j];
}
if(a[xx][yy]=='X')
return s+1;
if(xx<1||xx>n||yy<1||yy>n)
continue;
if(emy[xx][yy])
continue;
if(st[xx][yy])
continue;
if(a[xx][yy]=='C')
{
for(int i=yy-1;i>0;i--)
{
nm[xx][i]--;
if(a[xx][i]!='.')
break;
}
for(int i=yy+1;i<=n;i++)
{
nm[xx][i]--;
if(a[xx][i]!='.')
break;
}
for(int i=xx-1;i>0;i--)
{
nm[i][yy]--;
if(a[i][yy]!='.')
break;
}
for(int i=xx+1;i<=n;i++)
{
nm[i][yy]--;
if(a[i][yy]!='.')
break;
}
}
else if(a[xx][yy]=='K')
{
for(int i=0;i<8;i++)
{
int xxx=xx+dx[i],yyy=yy+dy[i];
if(xxx<1||xxx>n||yyy<1||yyy>n)
continue;
nm[xxx][yyy]--;
}
}
else if(a[xx][yy]=='B')
{
int j=yy-1;
for(int i=xx-1;i>0&&j>0;i--)
{
nm[i][j]--;
if(a[i][j]!='.')
break;
j--;
}
j=yy-1;
for(int i=xx+1;i<=n&&j>0;i++)
{
nm[i][j]--;
if(a[i][j]!='.')
break;
j--;
}
j=yy+1;
for(int i=xx-1;i>0&&j<=n;i--)
{
nm[i][j]--;
if(a[i][j]!='.')
break;
j++;
}
j=yy+1;
for(int i=xx+1;i<=n&&j<=n;i++)
{
nm[i][j]--;
if(a[i][j]!='.')
break;
j++;
}
}
else if(a[xx][yy]=='Q')
{
for(int i=yy-1;i>0;i--)
{
nm[xx][i]--;
if(a[xx][i]!='.')
break;
}
for(int i=yy+1;i<=n;i++)
{
nm[xx][i]--;
if(a[xx][i]!='.')
break;
}
for(int i=xx-1;i>0;i--)
{
nm[i][yy]--;
if(a[i][yy]!='.')
break;
}
for(int i=xx+1;i<=n;i++)
{
nm[i][yy]--;
if(a[i][yy]!='.')
break;
}
int j=yy-1;
for(int i=xx-1;i>0&&j>0;i--)
{
nm[i][j]--;
if(a[i][j]!='.')
break;
j--;
}
j=yy-1;
for(int i=xx+1;i<=n&&j>0;i++)
{
nm[i][j]--;
if(a[i][j]!='.')
break;
j--;
}
j=yy+1;
for(int i=xx-1;i>0&&j<=n;i--)
{
nm[i][j]--;
if(a[i][j]!='.')
break;
j++;
}
j=yy+1;
for(int i=xx+1;i<=n&&j<=n;i++)
{
nm[i][j]--;
if(a[i][j]!='.')
break;
j++;
}
}
else if(a[xx][yy]=='P')
{
nm[xx+1][yy-1]--;
nm[xx+1][yy+1]--;
}
q[++t][0]=xx;
q[t][1]=yy;
q[t][2]=s+1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
qe[t][i][j]=nm[i][j];
}
st[xx][yy]=true;
}
++h;
}
return -1;
}
int main()
{
//freopen("myans.in","r",stdin);
//freopen("myans.out","w",stdout);
while(scanf("%d",&n)!=EOF)
{
memset(emy,0,sizeof emy);
memset(st,false,sizeof st);
h=0;
t=-1;
getchar();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%c",&a[i][j]);
}
getchar();
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]=='O')
{
stx=i;
sty=j;
st[i][j]=true;
}
else if(a[i][j]=='C')
{
C(i,j,true);
}
else if(a[i][j]=='K')
{
K(i,j,true);
}
else if(a[i][j]=='B')
{
B(i,j,true);
}
else if(a[i][j]=='Q')
{
C(i,j,true);
B(i,j,true);
}
else if(a[i][j]=='X')
{
X(i,j);
}
else if(a[i][j]=='P')
{
emy[i+1][j-1]++;
emy[i+1][j+1]++;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cout<<emy[i][j];
cout<<endl;
}
printf("%d\n",bfs(stx,sty));
}
return 0;
}
/*
6
O.....
......
...B..
......
......
...X..
*/