社区讨论
快来救救我的屎山代码555
P3930SAC E#1 - 一道大水题 Knight参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhja70g6
- 此快照首次捕获于
- 2025/11/03 23:14 4 个月前
- 此快照最后确认于
- 2025/11/03 23:14 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
char a[55][55],z[55][55];
struct aa{
int x,y,t;
};
queue<aa> q;
int dx[]={0,1,1,2,2,-1,-1,-2,-2},dy[]={0,2,-2,1,-1,2,-2,1,-1};
bool vis[55][55]={0};
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
int sx,sy,wx,wy;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]=='O'){
sx=i;sy=j;
}
if(a[i][j]=='c'){
for(int k=1;k<=n;k++){
if(a[i][k]=='.'){
z[i][k]='#';
}
if(a[k][i]=='.'){
z[k][i]='#';
}
}
}
if(a[i][j]=='k'){
if(a[i-1][j-2]=='.')
z[i-1][j-2]='#';
if(a[i+1][j-2]=='.')
z[i+1][j-2]='#';
if(a[i+1][j+2]=='.')
z[i+1][j+2]='#';
if(a[i-1][j+2]=='.')
z[i-1][j+2]='#';
if(a[i+2][j-1]=='.')
z[i+2][j-1]='#';
if(a[i+2][j+1]=='.')
z[i+2][j+1]='#';
if(a[i-2][j+1]=='.')
z[i-2][j+1]='#';
if(a[i-2][j-1]=='.')
z[i-2][j-1]='#';
}
if(a[i][j]=='B'){
int x=i-min(i,j)+1,y=j-min(i,j)+1;
for(;x<=n;x++){
for(;y<=n;y++){
if(a[x][y]=='.'){
z[x][y]='#';
}
}
}
}
if(a[i][j]=='Q'){
for(int k=1;k<=n;k++){
if(a[i][k]=='.'){
z[i][k]='#';
}
if(a[k][i]=='.'){
z[k][i]='#';
}
}
int x=i-min(i,j)+1,y=j-min(i,j)+1;
for(;x<=n;x++){
for(;y<=n;y++){
if(a[x][y]=='.'){
z[x][y]='#';
}
}
}
}
if(a[i][j]=='X'){
for(int x=i-1;x<=i+1;x++){
for(int y=j-1;y<=i+1;y++){
if(a[x][y]=='.'){
z[x][y]='#';
}
}
}
wx=i;wy=j;
}
if(a[i][j]=='P'){
if(a[i+1][j-1]=='.'){
z[i+1][j-1]='#';
}
if(a[i+1][j+1]=='.'){
z[i+1][j-1]='#';
}
}
}
}
if(z[sx][sy]=='#'){
cout<<-1;
return 0;
}
q.push({sx,sy,0});
while(!q.empty()){
aa w=q.front();
q.pop();
for(int i=1;i<=8;i++){
int nx=w.x+dx[i],ny=w.y+dy[i];
if(nx>0&&nx<=n&&ny>0&&ny<=n&&vis[nx][ny]==0&&z[nx][ny]!='#'){
if(a[nx][ny]=='c'){
for(int k=1;k<=n;k++){
if(a[nx][k]=='#'){
z[nx][k]='.';
}
if(a[k][ny]=='#'){
z[k][ny]='.';
}
}
}
if(a[nx][ny]=='k'){
if(a[nx-1][ny-2]=='#')
z[nx-1][ny-2]='.';
if(a[nx+1][ny-2]=='#')
z[nx+1][ny-2]='.';
if(a[nx+1][ny+2]=='#')
z[nx+1][ny+2]='.';
if(a[nx-1][ny+2]=='#')
z[nx-1][ny+2]='.';
if(a[nx+2][ny-1]=='#')
z[nx+2][ny-1]='.';
if(a[nx+2][ny+1]=='#')
z[nx+2][ny+1]='.';
if(a[nx-2][ny+1]=='#')
z[nx-2][ny+1]='.';
if(a[nx-2][ny-1]=='#')
z[nx-2][ny-1]='.';
}
if(a[nx][ny]=='B'){
int x=nx-min(nx,ny)+1,y=ny-min(nx,ny)+1;
for(;x<=n;x++){
for(;y<=n;y++){
if(a[x][y]=='#'){
z[x][y]='.';
}
}
}
}
if(a[nx][ny]=='Q'){
for(int k=1;k<=n;k++){
if(a[nx][k]=='#'){
z[nx][k]='.';
}
if(a[k][nx]=='#'){
z[k][nx]='.';
}
}
int x=nx-min(nx,ny)+1,y=ny-min(nx,ny)+1;
for(;x<=n;x++){
for(;y<=n;y++){
if(a[x][y]=='#'){
z[x][y]='.';
}
}
}
}
if(a[nx][ny]=='X'){
for(int x=nx-1;x<=nx+1;x++){
for(int y=ny-1;y<=ny+1;y++){
if(a[x][y]=='#'){
z[x][y]='.';
}
}
}
}
if(a[nx][ny]=='P'){
if(a[nx+1][ny-1]=='#'){
z[nx+1][ny-1]='.';
}
if(a[nx+1][ny+1]=='#'){
z[nx+1][ny-1]='.';
}
}
vis[nx][ny]=1;
q.push({nx,ny,w.t+1});
if(nx==wx&&ny==wy){
cout<<w.t+1;
return 0;
}
}
}
}
cout<<-1;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...